ECS
Гуру-
Публикации
533 -
Зарегистрирован
-
Посещение
-
Победитель дней
203
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя ECS
-
С/Assembly все кто с Windows играют знают, без этого не как
-
Разве это несет какую-то пользу для конечного потребителя? Кроме спортивного интереса, в чем профит сбора кучи фич в одном скрипте, который не влезает в дефолтные лимиты еепрома?
-
Хех, в публичные сборки даже опенкомпы мало кто ставит, а ты про правку конфига и подозрительные для среднего админа операции с лимитами. Однако по функционалу твой продукт выглядит вполне вкусно. Почему бы не перевести его из гипертрофированного биоса в самостоятельную ОС? И кодить станет проще, и простор для творчества шире, и костылей в виде минификации/конфигов не потребуется, и конкуренция какая-никакая имеется На текущий момент topBiosV7 би лайк:
-
Затем, что современная майнось работает с только Т3 железом по причине "палитра". Какой смысл хранить атавистический функционал?
-
Это гуишный биос для гуишной оськи, я не вижу смысла в фиче запуска без GPU. Изначально он был приложением к майноси поверх опеноси, и поддерживал все тиры оборудования, а затем майноська ушла в стенделон, и нужда в первых двух тирах отпала. Ссылка была оставлена на всякий пожарный Оригинал можно найти в истории версий, но не думаю, что он кому-то понадобится: https://github.com/IgorTimofeev/MineOS/blob/349085db4b627529bcbc48609f536656e52b31e9/EFI/Full.lua
-
Ты используешь 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
- 2 ответа
-
- 4
-
-
Загрузка байткода недоступна по дефолту без правки конфига мода, проверка зашита в machine.lua. Сомневаюсь, что админы публичных серверов захотят включить эту фичу, пускай даже ради запуска знаменитых безопасных софтин rootmaster'а
-
Печальные баги - это, видимо, GUI.menu(1, 1, ...) вместо GUI.menu(1, 2, ...)? Ты же сам расположил менюху на Y = 1, где уже чиллит титловая строка. Разумеется, менюха ее перекрыла На всякий случай уточню, что гуйка работает с заранее известными координатами и размерами всех объектов, ничего не рассчитывая автоматически без ведома кодера - это не WPF/UWP с адаптивной версткой, т.к. ресурсы компов люто лимитированы. Исключения, конечно, есть в виде всяких GUI.layout или GUI.table, но это капля в море. Поэтому любая смена позиции или ресайз виджетов требует ручной обработки А, и еще кое-что: GUI.titledWindow / tabbedWindow и иже с ними - просто шаблоны, которые создаются буквально в 10 строчек кода на основе базового объекта окна GUI.window, но с учётом твоих личных нужд. В них попросту заранее выставлены нужные координаты и подогнаны размеры, ничего более
-
Под мышами я имел в виду нужду в хаотичном скроллинге документации :p Было бы клево иметь всю инфу в маркдауновой доке без нужды бегать к комментам в сырцах и обратно, я об этом Занятно, а что будет означать конструкция ?{a==nil}? Такая запись вообще валидна или же <> требуется в обязательном порядке? В доке сказано: "You can use <> inside lua code to execute program between <> as commands", из чего я сделал вывод, что <> выполняет некую программу. Но <a> выглядит как переменная, а не программа. Что такое program? Это просто собирательный термин или там действительно какие-то программы поддерживаются? Поясни, пожалуйста Наверное, это было бы правильно, но вкусовщина такая вкусовщина. Имхо, главное, чтобы тебе было удобно и понятно, а невежественный плебс в любом случае подстроится)0 Выглядит шикарно, особенно если бы это визуализировалось в некой скролл-зоне экрана, в то время сам скрипт писался бы в инпут-панели. Но так и до визуального кодинга недалеко, а это тревожный звоночек шизофрении!
-
Респект за соулс от мира опенкомпов! Вики очень достойная, но логику работы сложно осилить даже на примере \0ZZ, учитывая необходимость перма-скроллинга то по списку алиасов в сырце, то по списку операторов в самой вики. Да и без поиска тут не обойтись. Пожалей наши мыши! Интереса ради я решил вникнуть в первый пример: 1) Читаю команду \0, понимаю, что это useDown(), вопросов нет 2) Читаю команду Z, осознаю, что это алиас на %`~F'ta'N` ?M*'F?M`FN``RRMN`', приступаю к расшифровке 3) Читаю команду %, смекаю, это ещё один алиас на ?{<a>==nil}, отвечающий за проверку истинности результата выполнения некоего Lua-выражения. А какого? 4) Судорожно ищу, что такое <a>, и вроде бы даже нахожу нужную секцию: То есть, согласно вики, a - это программа, которая... что? Которая названа a? 5) Пытаюсь найти в сырцах некую программу с названием а, но тщетно 6) Допускаю, что, скорее всего, a - это переменная, которая пока еще не определена в текущем окружении. Вроде бы. То есть, наверное, выражение ?{<a>==nil} эквивалентно if a == nil. Или a - это все же программа? Ладно, хрен с ним 7) Возвращаюсь к пункту 2, читаю символ `, вновь обращаюсь к сырцам. В сырцах не нахожу. Видимо, оно в вики? Скроллю вики, нахожу искомое: Так, падаж-ж-жи! Интересно, зачем столько вариантов... для возможности использовать внутри строк другие кавычки, когда требуется? Если да, то это хорошо, хотя классический эскейпинг через \" был бы правильнее, т.к., например, я не смогу заюзать все 3 варианта кавычек в строке "hello `sunny`, you are 'so shiny' and "beautiful"". Или все же смогу? Энивей иду вперед 8) Натыкаюсь на символ ~, определяющий алиас на подпрограмму ~F'ta'. Судя по вики, у нас теперь определена некая подпрограмма F, выполняющая команды ta 9) Ищу, что такое t и a. Сырцы говорят, что t отвечает за robot.turn(clockwise). Вероятно, переменная а и отвечает за поворот по часовой стрелке? Вроде бы понятно... 10) Читаю новый неизвестный символ N. Хоспади, только не алиас... МАМОЧКИ, ЭТО ОН. Ищу в сырцах содержимое, нахожу логику инверсии перменной a -a{not <a>}... не-е-е, все, убейте меня. Софтина хорошая, идея клёвая, но нервная система у меня одна хд
-
Да, я поначалу думал заюзать pack/select, но в нашем случае это ломает кейс без таблицы дефолтных значений: f = L(function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end) f(1)(2)(3) Здесь невозможно определить, сколько всего аргументов принимает функция f(a, b, c), а затем выполнить её на этапе (3). Хотя, конечно, мы могли бы ограничиться условием, что таблица дефолтных значений требуется всегда, что позволило бы на основании ее размера судить о кол-ве аргументов функции f. Но это уже вопрос к @Krutoy Зато через pack можно решить проблему с nil в кач-ве последнего аргумента любого из замыканий в цепочке:
-
Хе-хе, вот поэтому без внятного ТЗ результат ХЗ: не было ж ни слова про nil'овые дефолты. Вообще вариант у нас лишь один - всегда указывать размер таблицы defaults вручную, если в ней присутствует nil в конце, т.к. lua попросту не воспринимает его ни в случае вараргов, ни при инициализации таблицы напрямую: print(#{nil, "b", "c"}) -- 3 print(#{"a", nil, "c"}) -- 3 print(#{"a", "b", nil}) -- 2 print(#{[1] = "a", [2] = "b", [3] = nil}) -- 2 Поэтому только ручками, видимо: local function L(f, fArgsCount, defaults) fArgsCount = fArgsCount or 1 if fArgsCount <= 1 then return f end local fArgIndex = 1 local fArgs = {} local function appendNextArg() if fArgIndex > fArgsCount then return f(table.unpack(fArgs, 1, fArgsCount)) end return function(...) local fArgsParts = {...} if #fArgsParts == 0 then fArgs[fArgIndex] = defaults and defaults[fArgIndex] or nil fArgIndex = fArgIndex + 1 else for i = 1, #fArgsParts do fArgs[fArgIndex] = fArgsParts[i] or (defaults and defaults[fArgIndex] or nil) fArgIndex = fArgIndex + 1 end end return appendNextArg() end end return appendNextArg() end local function test(name, expectedResult, f) local result = f() print("[" .. (result == expectedResult and "Passed" or "Failed") .. "] " .. name .. ":") print("Expected: " .. tostring(expectedResult)) print("Got: " .. tostring(result)) print() end test( "test 1: no defaults, no result", nil, function() f = L(function() print('succes!') end) f() end ) test( "test 2: no defaults, every argument is passed directly", "a:1 b:2 c:3", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3 ) return f(1)(2)(3) end ) test( "test 3: no nils in defaults", "a:a b:e c:c", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3, {'a', 'b', 'c'} ) return f()('e')() end ) test( "test 4: nil at defaults middle", "a:a b:nil c:c", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3, {'a', nil, 'c'} ) return f()()() end ) test( "test 5: nil at defaults end", "a:1 b:b c:3", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3, {'a', 'b', nil} ) return f(1)()(3) end ) test( "test 6: multiple returns, nil at defaults end", "a:a b:2 c:nil", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3, {'a', 'b', nil} ) return f(nil, 2)() end ) Фичу мульти-ретурна я сделал, фигня вопрос, однако если какая-то функция из цепочки вернет результат с nil в конце - система сдохнет. Тут уж либо опять вручную указывать кол-во аргументов, либо забить болт: test( "test 7: multiple returns with nil at end", "a:a b:2 c:nil", function() f = L( function(a, b, c) return 'a:' .. tostring(a) .. ' b:' .. tostring(b) .. ' c:' .. tostring(c) end, 3, {'a', 'b', 'c'} ) return f(2, nil)() end )
-
local function L(f, ...) local defaults = {...} if #defaults == 0 then return f end local defaultIndex = 1 local fArgs = {} local function appendNextArg() if defaultIndex > #defaults then return f(table.unpack(fArgs)) end return function(fArg) table.insert(fArgs, fArg or defaults[defaultIndex]) defaultIndex = defaultIndex + 1 return appendNextArg() end end return appendNextArg() end f = L(function(a, b, c) return a .. b .. c end, 'a', 'b', 'c') print(f()('e')()) -- Нужно что бы вывело "aec" f = L(function() print('succes!') end) f() -- Должно выводить "succes!" В общем, не уверен, что я правильно понял задачу, но ТЗ из второго примера результат соответствует
-
Если запустить этот пример, то f() не выдает ничего, хотя сказано обратное. Пруф: Поясни, пожалуйста, должна ли функция L по ТЗ выдавать функцию print, если n = 0, или же наоборот не должна
-
Этот параметр сообщает экранному буферу, что нужно отобразить не только изменившиеся с последней отрисовки пиксели, а вообще все сразу. Обычно эта необходимость возникает при запуске скриптов, работающих с GPU напрямую в обход концепции экранного буфера. То есть в случае майноси практически никогда. Разве что для каких-нибудь старых игр или скринсейверов фича может быть востребованной... В доке по workspace он указан, хотя и без пояснений. Могу добавить инфу на всякий, если нужно:
-
Пардон, старая тема, забыл обновить ссылку: https://github.com/IgorTimofeev/GUI/blob/0fadb161469d404d477dd9babfdc9a5aa42ff203/README.md
-
Хех, она не будет работать вообще никак, т.к. у нее одна зависимость: MineOS целиком. Если интересны подробности, то вот лонгстори: изначальная версия гуи-либы писалась как простая основа для графической оболочки поверх OpenOS, и "из коробки" она поддерживала лишь наиболее привычные виджеты типа кнопок/картинок/слайдеров (кстати, по ссылке выше как раз та самая версия). MineOS была скорее технодемкой возможностей гуишки. Однако время шло, появилась потребность в перетаскиваемых окошках, файловых модальных диалогах, селекторах цвета и т.п. Также требовалось все больше и больше узкопрофильного функционала - например, почанковое скачивание файлов с обработчиками данных или побитовые приколюхи типа file:readBytesAsNumber(count, isLittleEndian). Все эти мелочи использовались довольно часто как в системных либах по работе с пикчами, так и в прикладном софте типа MIDI-парсера или мини-игр. Изначально я оформлял их в виде дополнительных библиотек типа AdvancedLua или Web, однако просто устал плодить архитектурный говнокод. Контрольным выстрелом оказалась обнова OpenOS (1.6, если не ошибаюсь), где поменялись API process/event, что убило инсталлер MineOS на новых версиях мода. В итоге я решил, что быстрее будет написать чистую ОС с интегрированной UI'шной бизнес-логикой, чем пытаться адаптироваться под существующую Собственно, вот, интеграция вышла по самые помидоры. Глобальный минус один - либы настолько глубоко засели друг в друге, что проще писать под MineOS, чем пытаться их выдрать и использовать в другой ОС. На всякий случай я сохранил старые версии гуишки в виде легаси - но никаких новых фич и фиксов, конечно, там уже не будет
-
За работоспособность самой либы не ручаюсь, т.к. с тех времен вышла тысяча и одна обнова под майнось, но инсталлер рабочий: pastebin run ryhyXUKZ
-
Не-а, из коробки "норм способа" нет. Зато ты можешь написать либу, инкапсулирующую все физические GPU и предоставляющую фейковую GPU, чтобы в автоматическом режиме биндиться к мульти-мониторной конструкции и выводить данные за пределами одного моника. Тогда весь софт действительно будет работать "нормально", если только он не залочен под какое-то константное разрешение. Вопрос лишь в производительности, которой не станет)0
-
Это я себя ассоциирую с невежественной макакой, не осознающей всю гениальность хода творца, лишающего юзера возможности выбирать архитектуру пеки Макака в своих влажных фантазиях уверена, что побитовые операторы имеют эквивалент в виде bit32, а string.unpack заменяется на цикл, формирующий число в big endian без привязки к архитектуре... но макака слишком глупа! Макака извиняется
-
Тебе в любом случае придется работать с тем, что дал ненавистный автор-угнетатель. Что толку возмущаться? Добавь простенькое XOR-хеширование с солью хотя бы, чтобы не хранить пасс в открытом виде
-
Бажочек, getDeviceInfo() возвращает пустую таблицу:
-
как определить уровень видеокарты/монитора до их соенденения
ECS ответил в вопрос logic в Компоненты
Но... ты же сам хотел узнать уровень до подключения к экрану, а теперь ругаешься, что после подключения метод становится невалидным... Еще можно по параметру width. По названию не скажешь, но он как раз олицетворяет предельную глубину цвета для видеокарты. Пример на компьютере с 3 независимыми GPU всех 3 тиров и APU 2 тира, привязанного к экрану 1 тира: -
как определить уровень видеокарты/монитора до их соенденения
ECS ответил в вопрос logic в Компоненты
local component = require("component") for address in component.list("gpu") do local gpu = component.proxy(address) local maxDepth = gpu.maxDepth() if maxDepth == 8 then -- Tier 3 elseif maxDepth == 4 then -- Tier 2 else -- Tier 1 end end
