Taruu
-
Публикации
62 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Сообщения, опубликованные пользователем Taruu
-
-
Когда писал свои часы для биоса, нашел на формуе готовый код с объяснениями.
Если хочется дублировать картинку на все мониторы то как вариант отредачить lua bios и посмотреть что будет, но стоит понимать что скорость зависит от уровня видеокарты
https://oc.cil.li/topic/1596-multi-screenscreen-mirroring/ -
9 часов назад, Bs0Dd сказал:Ох блииин, я уже и забыть успел про это творение. И сайтик так и не доделал. Тааак, придется, чую, вспоминать что там и как у меня было. Займусь, как немного освобожусь от учебы.
Хорошо. Пни тогда меня. Есть идеи как улучшить NFPL, имхо в случае длинных страничек есть большие проблемы и неперевариемость со стороны стерилизатора, и нужно это исправлять... для чтения очень больших страничек :/
-
1
-
-
Нашел еще более критичный баг. Браузер не умеет в большие страницы в целом.
Пределом возможности сталserialization.unserialize.
Скорее всего у компа кончается память или в нем есть предел для размера.
Решать это нужно через чтения файла и изменения принципа прокрутки.
Так как код браузера я не особо понял и контакты на вк устарели, то прошу @Bs0Dd мне постучатся в контаткты :^ -
Начал писать переводчик в язык NFPL и уже поймал баг :>
как я понял браузер верит хосту и думает что NFPL валидный всегда... что не есть хорошо.
Соответственно я скормил ему просто плохой JSON и поймал такое:
-
В 19.05.2021 в 14:13, Krutoy сказал:Эх, ностальгия.
Почитав тред и посмотрев наработки @Bs0Dd так и хочется натереть ему нос и показать тру-HTML с первоначальной идеей отображать реальные веб-страницы.
Но правда, уже полтора года программирую свой 1.12.2 "Эксперт" модпак на ZenScript, и поэтому LUA пока ждет на полке.
Еще, изучив VueJS, хочется сразу делать реактивный браузер. Это будет сразу возможностью использовать браузер как GUI.
Но, думаю, не скоро.
Если кто то всё еще сильно хочет исходников - пишите. Попытаюсь нарыть и залить.
Я как понимаю там парсер html был с 0 написан? ибо то что находил готовое жрало таблицы и комп уходил в отказ,
А как начал думать, понял что нужен парсер SGML и уже дальше плясать от этого...И понял что я это заколебусь рожать его на lua / - /
-
9 минут назад, BrightYC сказал:Нельзя. Программа на уровне EEPROM может подменить вызовы и к component.invoke. В том числе и к очереди сигналов и прокси компонентов.
А если робот выключен, и тыкнуть его анализатором то там тоже подмена сработает?
-
1 минуту назад, BrightYC сказал:собственно, вся тема об этом, а не о том, как сохранить данные. Всякие secure boot бесполезны, если самый главный загрузчик скомпрометирован.
я там добавил.
-
7 минут назад, BrightYC сказал:какой смысл, если EEPROM могли подменить? Ну засунешь дискету - а какой смысл, если код был запущен еепромой, которая пожет подменить *все*.
Кстати, немного оффтопа, но дата-карта не обязательна. Она медленнее, чем software решения.Ты имеешь в виду тот случай когда у нас стырили робота и потом вернули?
Или то что мы не знаем залезали ли в него или нет? Можно тогда в дискету засунуть uuid робота и если его пересобрали то дискета просто скажет фи... Ибо uuid поменяется -
А можно ли сделать защиту при помощи внешнего ключа?
Те зашифровать все данные в роботе, а для его запуска юзать дискету с ключом и автораном.
На ходу юзать Дата карту 2-3 уровня (можно даже карту достать) что бы запустить весь код, и после можно вынуть дискету.
И если у нас сперли робота то результату будет ноль. Ведь для его запуска нужно засунуть дискету.И для того что бы узнать код, нужно тоже юзать дискету или знать ключ.
Сработает ли такой вариант? -
В 15.04.2021 в 02:29, daniilFigaSystem сказал:нее с майн ос 100% нет я ненавижу макось
Я буду делать ос на Основе OpenOS
пока почти сделал boot.lua и bin файлы
Кстати а как инсталлятор сделать я просто не умею
Может тогда стоит сделать пародию на Windows 3.0 и 95, 98?
Которые вообще через DOS работали и сделать так же для начала? Только вместо DOS, openOS.
А то в свое время MineOS так работала, но только от бесчисленного кол во костылей Игорь решил писать ось с 0....
Так что как минимум советую тебе техническое задание составить
-
@eu_tomat Ок. Глянь что у тебя было в наработках. Посмотрим что было и что можно придумать. А так я хз стоит ли лезть так глубоко. Ибо может оказаться что результат будет тот же.
-
-
9 часов назад, eu_tomat сказал:В этом месте я всё-таки ожидал увидеть экспериментальное подтверждение «эффективности» этого трюка. Но именно это заблуждение надо развеять в первую очередь.
Эксперимент:
local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) -- Результат: 6631
Тут ошибочка получается. У тебя print в памяти остается ?:/ Так что каждый раз нужно в переменную записывать.
local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 mem0 = computer.freeMemory() for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) print() mem0 = computer.freeMemory() print("test") print(mem0 - computer.freeMemory())И вот что мне вывело:
-
2
-
-
Скрытый текст7 часов назад, eu_tomat сказал:Пффф.. Ну, раз я влез в эту тему, то продолжу обсуждение.
Не совсем. Как долго работает компьютер, скажет computer.uptime(), а os.clock() скажет, сколько из этого времени компьютер потратил на, собственно, вычисления. Конечно, с некоторыми оговорками, но в целом именно os.clock() позволяет оценить нагрузку, создаваемую тем или иным кодом на игровой сервер.
Это грязный эксперимент с неправильной интерпретацией результата. В нём извлечение поля из таблицы выполняется два раза, о чём не упомянуто в описании.
Также эксперимент не сообщает о том, имеет ли смысл создавать локальную переменную для функции math.sin, если её планируется использовать всего два раза. Или пять, например.
Во всех экспериментах маловаты измеряемые интервалы времени. Но в этом они слишком малы. Шум легко может оказаться выше реальной разницы во времени. А шум есть всегда, даже при выполнении кода на оборудовании с избыточной мощностью.
А здесь как раз именно шум не позволяет увидеть, что a,b = b,a имеет ровно ту же эффективность. Вообще, при интерпретации результатов следует сравнивать полученную разницу с шумовой, чтобы не делать преждевременных выводов.
В этом месте я всё-таки ожидал увидеть экспериментальное подтверждение «эффективности» этого трюка. Но именно это заблуждение надо развеять в первую очередь.
Эксперимент:
local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) -- Результат: 6631
Результат: Обмен значений переменных через a,b=b,a потребляет ровно 0 дополнительной памяти и быстро работает. Зато обмен посредством XOR и память потребляет, и работает медленно, да ещё и код загромождает.
Я не знаю, почему этот вредный совет транслируют на форумах программистов. Вне сомнений, в арсенале программиста должен быть трюк обмена переменных через исключающее или. Но зачем его тулить к месту и не к месту? Урок же вроде как про оптимизацию кода.
И даже если бы этот трюк оказался эффективным, почему нет упоминания о том, что xor работает не для всех типов переменных?
И раз пошёл такой разговор, разберу предыдущее обсуждение:
Эффективнее со всех точек зрения.
Lua для любых операций создаёт буферные переменные для хранения временных результатов. Но, в случае a,b=b,a они уничтожаются незамедлительно в отличие от xor. Операция a,b=b,aтребует на выполнение столько же времени, как три отдельных операции присваивания, но потребления памяти не увеличивает.
Сейчас поправим тогда.
-
Итак делаю более структурированный пост чем был до этого...
Для показания производительности используются:
os.clock() - дает приблизительное время работы CPU во время исполнения программы.
computer.freeMemory() - дает нам узнать сколько памяти есть у компа.
Локализация функций:
Делайте функции в программе локальными. Это работает как и с локализацией существующих функций.
Пример с функцией math.sin и ее локальной версией:
local computer = require("computer") local unicode = require("unicode") local x = 0 local sin = math.sin local start = os.clock() local memory_start = 0 for i=1,1e5 do x = math.sin(i) end print("1e5 math.sin",os.clock()-start) start = os.clock() for i=1,1e5 do x = sin(i) end print("1e5 local.sin",os.clock()-start) --Замер для редкого вызова start = os.clock() x = math.sin(3) x = math.sin(10) x = math.sin(16) x = math.sin(42) print("rare math.sin",os.clock()-start) start = os.clock() x = sin(3) x = sin(10) x = sin(16) x = sin(42) print("rare local.sin",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = math.sin(42) print("one math.sin",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local sin2 = math.sin start = os.clock() x = sin2(42) print("one local.sin2",os.clock()-start, "memory take",memory_start-computer.freeMemory())
Из данных тестов видно что локализация функций имеет смысл при частом обращении, но в случае же одиночного вызова функции смысла это не придает и на ход поршней особо сильно не влияет...
Так же я решил проверить данный метод на openOS библиотеке unicode
local computer = require("computer") local unicode = require("unicode") local x = 0 local start = os.clock() local memory_start = 0 local un_len = unicode.len for i=1,1e5 do x = unicode.len(tostring(i)) end print("1e5 unicode.len",os.clock()-start) start = os.clock() for i=1,1e5 do x = un_len(i) end print("1e5 local.len",os.clock()-start) --Замер для редкого вызова start = os.clock() x = unicode.len("Арбуз") x = unicode.len("Помидор") x = unicode.len("Капитализм") x = unicode.len("Ракета") print("rare unicode.len",os.clock()-start) start = os.clock() x = un_len("Арбуз") x = un_len("Помидор") x = un_len("Капитализм") x = un_len("Ракета") print("rare local.len",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = unicode.len("Hello world!") print("one unicode.len",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local un_len2 = unicode.len start = os.clock() x = un_len2("Hello world!") print("one local.len",os.clock()-start, "memory take",memory_start-computer.freeMemory())
Тут же прирост в производительности не особо заметен. Так что стоит отдельно проверять библиотеку или функцию на эффективность такой локализации.
Так же можно локализовать и свои функции:
local computer = require("computer") local x = 0 local start = 0 local memory_start = 0 memory_start = computer.freeMemory() function func1(a,b) return a + b end start = os.clock() x = func1(9,0.3) print("norm func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) memory_start = computer.freeMemory() local func2 = function(a,b) return a + b end start = os.clock() x = func2(9,0.3) print("local func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) start = os.clock() for i=1,1e5 do local x = func1(i,i) end print("func1 \t",os.clock()-start) start = os.clock() local sin = math.sin for i=1,1e5 do local x = func2(i,i) end print("func2 \t",os.clock()-start)
Так же стоит понимать что все зависит от вашей функции, но все же можно лишний раз локализовать... Вроде на ход поршней не влияет.... Главное не локализовывать функции в программе которые вызываются один раз. Это вообще не даст ничего и даже наоборот может замедлить работу (если таких функций много).
Локальные переменные
Используйте локальные переменные в зависимости от своей задачи. Если вам нужно сэкономить память то создавайте локальные переменные в функциях а если вам нужна переменная которая нужна множеству функций то лучше ее объявить глобально.
Локальные переменные в функциях удаляются после завершения работы функции что позволяет сэкономить место в памяти.--var_global local computer = require("computer") local memory_start = computer.freeMemory() local test_table = {1,2,3,4,5,6,7,8,9,10} function work_on_test_table() --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory()) --var_local local computer = require("computer") local memory_start = computer.freeMemory() function work_on_test_table() local test_table = {1,2,3,4,5,6,7,8,9,10} --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory())
Подготовка объектов (таблиц)
Лучше подготовить таблицу с частью необходимых значений и их уже дополнять.
print("create obj") start = os.clock() local t = {} for i = 1970, 2000 do t[i] = os.time({year = i, month = 6, day = 14}) end print("direct insertion time", os.clock()-start) start = os.clock() t = {} local aux = {year = nil, month = 6, day = 14} for i = 1970, 2000 do aux.year = i t[i] = os.time(aux) end print("prepared insert time", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {} a[1]=1; a[2] = 2; a[3] = 3 end print("num insert", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {true,true,true} a[1]=1; a[2] = 2; a[3] = 3 end print("prepared insert", os.clock()-start)
X*X вместо X^2
Если нам нужна 2 степень числа то быстрее это будет умножить чем возводить в степень, Но если у нас уже 3 степень или больше то данный финт бесполезен.
local start = os.clock() for i=1,1e7 do local x = i * i end print("*",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 2 end print("^",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i * i * i * i * i end print("* X5",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 5 end print("^ 5",os.clock()-start)
Swap переменных
Самый быстрый способ это использовать временную переменную,
красивый и почти такой же эффективный метод перестановки переменных будет a,b = b,a
Так же стоит отметить что не один из перечисленных способов не требует выделения памяти.
Скрытый текстlocal a,b = 23,76 local computer = require("computer") local memory_start = 0 local start = 0 print("test 1e7") memory_start = computer.freeMemory() start = os.clock() for i=1,1e7 do a,b=b,a end print("swap a,b = b,a", os.clock()-start, memory_start - computer.freeMemory()) -- Результат: 0 memory_start = computer.freeMemory() start = os.clock() local temp1 = 0 for i=1,1e7 do temp1 = a a = b b = temp1 end print("temp \t",os.clock()-start, memory_start - computer.freeMemory()) memory_start = computer.freeMemory() start = os.clock() for i=1,1e7 do a=a~b b=a~b a=a~b end print("swap ~ \t",os.clock()-start, memory_start - computer.freeMemory()) print() print("test 100") memory_start = computer.freeMemory() start = os.clock() for i=1,100 do a,b=b,a end print("swap a,b = b,a", os.clock()-start, memory_start - computer.freeMemory()) -- Результат: 0 memory_start = computer.freeMemory() start = os.clock() local temp2 = 0 for i=1,100 do temp2 = a a = b b = temp2 end print("swap temp",os.clock()-start, memory_start - computer.freeMemory()) memory_start = computer.freeMemory() start = os.clock() for i=1,100 do a=a~b b=a~b a=a~b end print("swap ~ \t",os.clock()-start, memory_start - computer.freeMemory()) print() print("one swap") memory_start = computer.freeMemory() start = os.clock() a,b=b,a print("swap a,b=b,a ",os.clock()-start, memory_start - computer.freeMemory()) memory_start = computer.freeMemory() start = os.clock() local temp = 0 temp = a a = b b = temp print("swap temp",os.clock()-start, memory_start - computer.freeMemory()) memory_start = computer.freeMemory() start = os.clock() a=a~b b=a~b a=a~b print("swap ~ \t",os.clock()-start, memory_start - computer.freeMemory())
Вот все что смог более менее конкретное накопать и проверить. Прошу кинуть в лицо ошибки или вопросы. Вместе подумаем.... Теперь поправили.
-
2
-
-
2 часа назад, eu_tomat сказал:Изначально я не хотел комментировать этот «урок», т.к. объём комментариев в несколько раз превысил бы изначальный текст. Главная претензия к нему в отсутствии конкретики и каких-либо примеров, позволяющих читателю прийти к тем же выводам.
@Taruu , приведя конкретный пример, спасает этот урок.
Если кто-то хочет продолжить это начинание, я прошу не скидывать все замеры в одну программу, или хотя бы в коде одной программы дробить код на блоки и добавлять короткое описание, что именно там измеряется. Например, так:
Демонстрация: локальная функция sin работает в два раза быстрее, чем функция math.sin. Замедление происходит два раза: при извлечении поля math из таблицы глобальных переменных и при извлечении поля sin из таблицы math.
кусочек кода
Также можно привести ещё пример, демонстрирующий, что работа с глобальной переменной равносильна работе с полем таблицы.
А ещё важно продемонстрировать, начиная с какого числа использований становится выгодным копировать функцию math.sin в локальную переменную. Потому что если бездумно повторять советы из этого «урока», то вместо оптимизации может получиться пессимизация.
Также я советую для записи чисел с большим количеством нулей использовать научную форму. Чтобы понять, сколько нулей содержит число 100000, мне приходится задерживать взгляд на этом числе, а запись 1e5 считывается мгновенно.
Я больше как пример того что смог найти. Оформлять это точно еще надо (я просто протестировал наскоряк).
Ихмо я бы залез на уровень языка и посмотрел почему это работает быстрее :/
Сейчас попробую оформить это хоть во что-то читабельное. -
Если кратко у любителей факторки поймал вот эту книжку.
Написал вот этот код:
Скрытый текстlocal computer = require("computer") function freeMemory() local result = 0 for i = 1, 10 do result = math.max(result, computer.freeMemory()) os.sleep(0) end return result end function memoize (f) local mem = {} -- memoizing table setmetatable(mem, {__mode = "kv"}) -- make it weak return function (x) -- new version of ’f’, with memoizing local r = mem[x] if r == nil then -- no previous result? r = f(x) -- calls original function mem[x] = r -- store result for reuse end return r end end print("function") local start = os.clock() for i=1,100000 do local x = math.sin(i) --0.026591985 end print(os.clock()-start) start = os.clock() local sin = math.sin for i=1,100000 do --local x = math.sin(i) --0.026591985 local x = sin(i) --0.01030093 end print(os.clock()-start) print("tables") start = os.clock() for i = 1, 100000 do local a = {} a[1]=1; a[2] = 2; a[3] = 3 end print(os.clock()-start) start = os.clock() for i = 1, 100000 do local a = {true,true,true} a[1]=1; a[2] = 2; a[3] = 3 end print(os.clock()-start) print("fill nil") t = {} lim = 20000 for i = 1, lim do t[i] = i end start = os.clock() for k in pairs(t) do t[k] = nil end print(os.clock()-start) t = {} for i = 1, lim do t[i] = i end start = os.clock() while true do -- хорош для малых таблиц и поиска по ним. Но крашит комп при больших таблицах local k = next(t) if not k then break end t[k] = nil end print(os.clock()-start) print("time demo") start = os.clock() local t = {} for i = 1970, 2000 do t[i] = os.time({year = i, month = 6, day = 14}) end print(os.clock()-start) start = os.clock() local t = {} local aux = {year = nil, month = 6, day = 14} for i = 1970, 2000 do aux.year = i t[i] = os.time(aux) end print(os.clock()-start) print("memory demo") print("start \t \t",computer.freeMemory()) freeMemory() for i = 1, lim do t[i] = i end print("with normal table ", computer.freeMemory()) t_m = memoize(t) t = {} print("with memoryzed \t",computer.freeMemory())
И вот какой результат:
Как видно некоторые моменты реально спасают а некоторые не очень.
Там еще есть совет о корутинах но я не проверял.
-
2
-
-
10 часов назад, Bs0Dd сказал:А почему б и нет. В теории можно парсить страницу и превращать ее в подобные объекты в NFPL, но
- Нужно сделать конвертацию картинок в OCIF и резать их по разрешению, ибо даже при невысоких разрешениях отрисовка существенно замедляется
- Нужно рассчитывать координаты объекта, ибо NFPL - координатно ориентированный язык и каждый объект имеет свои координаты
- NFPL пока не подразумевает наличие скриптов (однако Lua-подобные скрипты планируются) поэтому пока что страницы будут исключительно статичные
В остальном, в принципе, ничего невыполнимого нет, хоть на ходу их конвертировать на сервере (получится туннель HTML-NFPL), но я в HTML не слишком специалист, поэтому сам заниматься этим не буду. Так что если кто хочет - мануал по языку в шапке есть, дерзайте!
Я просто уже находил упрощятор html на питоне. Попробую сделать хотя бы какой то конвертор и повесить на расберю. Как только руки дойдут конечно)
-
1
-
1
-
А теперь вот интересно.
Можно ли сделать переводчик из html + css в nfl сторонним языком. и стоит ли игра свеч...-
1
-
1
-
-
11 час назад, VladG24_YT сказал:- Добавлен алгоритм запуска OCEmu для Ubuntu и Arch Linux (требует предустановленного интерпретатора Lua 5.2 и библиотек luaffib, luafilesystem, luautf8 и SDL2)
Там вроде и 5.3 работает. И на нем лучше и писать ибо там ось новой версии.
-
Очень полезным считаю автодополнение кода.
Причем как и lua кода в папочках, так и прямое API к OC.
Ибо сейчас юзаю tabnine в Atom (Vscode не влюбился мне) что бы он периодически подсказывал код и то в слепую)Идея годная, главное что-бы было логическое завершение.
-
10 часов назад, Bs0Dd сказал:Впринципе, раз уж Doob сделал упаковщик для программ, я могу сделать упакованную версию с хранением данных в спец. области EEPROM.
Но в таком случае для работы вместо жесткого диска потребуется карта данных
Ну зато система будет монолитом. И хакнуть не получится.
-
2 часа назад, NEO сказал:Довольно сложно для фана. Такого порядка задачи требуют знатной мотивации.
Там больше проблем будет в плане написания ихмо велосипед.
Хотя сделать базу на уровне sqlite было бы за глаза для майновского уровня.
И больше идет вопрос как делать? SQL или свои мини костыли....Как вариант можно попробовать упоротся и сделать хотя бы быстрый csv ридер.
Уже будет хоть что то.
-
10 часов назад, whiskas сказал:Да и еще прийдется делать их куча а каждый будет забирать -1 от общего количества компонентов.
Ну тогда тут все утыкаетя в базу данных :/
Странно что никто еще не делал СУБД под opencomputers...


LostUser - простейший робот
в eeprom
Опубликовано:
Идея крутая, но чую что тут не хватает аля SPA простого который тупо рисовал блок-схемы или человеко читаемый код. А при желании еще и разжевывал что каждая команда делает с примерами и видосами. Но там кол-во работы настолько большое что повеситься можно >_<