ProgramCrafter
-
Публикации
245 -
Зарегистрирован
-
Посещение
-
Победитель дней
41
Сообщения, опубликованные пользователем ProgramCrafter
-
-
5 часов назад, Oleshe сказал:можно выдать его командой
Надо содержимое рюкзака помнить, а так /give <кому> <название предмета>:<метаданные>{<NBT-тег>}
Дело в том, что у рюкзака как такового может не быть ID - его инвентарь хранится обычно в NBT-теге.
5 часов назад, Oleshe сказал:подредактировать level.dat
Тоже, в принципе, можно. Если известно, что в рюкзаке было.
-
3 минуты назад, Krutoy сказал:Я только что понял, что я могу изменять метатаблицы строк!
Вроде machine.lua в OpenComputers запрещал так делать.
Что ли, ещё один баг в OC нашёлся?
-
47 минут назад, Krutoy сказал:~:t{pt(k,v)}Лучше ~kv:t{pt(k,v)} (или как-то так), потому что циклы могут ведь вкладываться друг в друга.
-
49 минут назад, Fingercomp сказал:Проект заброшен
Но всё-таки hpm install stem в разы удобнее, чем искать ту же ссылку на форуме.
-
1
-
-
14 часа назад, Anon сказал:Судя по всему, стек вызовов настолько большой, что debug.traceback заменила его часть на "(...tail calls...)". Это недоработка разработчиков самого lua, так как во время отладки важно видеть первые вызовы, а не последние.
Неправда. Tail call - это вызов, сделанный в строке return:
local function f2() return error('tail call') end local function f3() return f2() end print(xpcall(f3, debug.traceback)) --[[ false input:2: tail call stack traceback: [C]: in function 'error' input:2: in function <input:1> (...tail calls...) [C]: in function 'xpcall' input:8: in main chunk [C]: in function 'pcall' demo.lua:60: in main chunk [C]: in ? ]]
Это оптимизация, позволяющая использовать бесконечную рекурсию без переполнения стека - запись о старой функции (её upvalues и тому подобное) удаляется, и её место занимает новая запись.
Без этой оптимизации плохо, поэтому это не недоработка.
-
2 минуты назад, Oleshe сказал:И где этот баг?
В /bin/source.lua - когда фиксили /bin/sh.lua, сломался этот файл, исполняющий построчно команды из .shrc.
Фикситься должно так: поставить в 33 строку process.internal.continue(source_proc, line) (убрать _ENV).
-
Отсылаю issue. Я даже знаю, где баг и как его фиксить.
-
10 часов назад, kaka888 сказал:Получится ли зайти на сервер со своей сборки?
Да, сам так делаю.
10 часов назад, kaka888 сказал:Отсутствует api-ms-win-core-path-l1-1-0.dll.
Слишком новый питон, в котором удалили поддержку Windows 7 (вроде бы и 8).
@Wolframoviy надо даунгрейдить до Python 3.8.
-
Да, файл надо закидывать с другой системы.
Кстати, а всё сломалось на компьютере или на роботе? @eu_tomat говорил, что компьютеры, заспауненные через /oc_sc, работают.
-
4 минуты назад, Totoro сказал:Ну тогда это возможно тема для ещё одной issue.
Да, я вчера писал это в дискорде и в IRC.
Фикс такой: добавить require('core/full_buffer') в какой-нибудь файл - например, /boot/95_robot_fix.lua.
-
1
-
-
Отрисовка четырёх основных форматов картинок (PNG, JPG, BMP, GIF) работает!
В частности, BMP и GIF отрисовываются без использования временных файлов и поэтому работают внутри контейнера. У всех форматов, кроме PNG, даунскейл происходит по одному алгоритму.
JPEG:
Скрытый текст
GIF:
Скрытый текст
BMP:
Скрытый текст
PNG:
Скрытый текст
-
3
-
-
Контейнер был обновлён!
Новая фича: правильная работа библиотеки process, /dev/null и /dev/full.
Чтобы запустить команду с перенаправлением, можно пользоваться sh. Если sh не работает, убедитесь, что у вас установлена самая новая OpenOS (например, проверьте ту же команду в хост-системе). Похоже, что шелл не работал минимум 2 года (требовал первым аргументом таблицу, которую невозможно передать из терминала), и фикс был всего три месяца назад.
Запись файлов внутри контейнера всё ещё не поддерживается.
/home # container sh "echo 1 >/dev/null" /home # container sh "echo 1 >/dev/full" /home # container ls /dev components eeprom eeprom-data null random zero /home # container sh time "set >/dev/null" real 0m0.250s cpu 0m0.012s /home # container save-same-files /home/container.lua:155: unsupported open type: wb: stack traceback: ...
-
Добавлен скрипт save-same-files:
wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/save-same-files.lua
Запаковывает в контейнер только те файлы, которые были в старой версии архива. Можно использовать для того, чтобы копировать только нужные файлы с рабочего компьютера и не раздавать оттуда все секреты и печеньки.
-
Даунскейлинг готов и интегрирован в отрисовку GIF и JPG.
Последствия: JPG открывается плохо, с OOM.
Скрытый текст
Рекомендую использовать для запуска программы контейнер (https://computercraft.ru/topic/6134-polu-docker/), в котором лежат графические библиотеки со всеми нужными патчами:
wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/images-drawer/archive.bin
До масштабирования JPG работал!
Скрытый текст
-
Новая версия архиватора (enum-files.lua) спрашивает для каждого файла, включать его в архив или нет.
Старую версию скрипта можно скачать здесь: https://gitlab.com/ProgramCrafter/lua-utils/-/raw/82d66b04b02118499cc577344fa4de924c177105/half-docker/enum-files.lua.
Хотя смысла в этом немного - чтобы добавить в архив всё, достаточно запустить yes | enum-files.
-
6 часов назад, ProgramCrafter сказал:Подменяется только io.open - to be fixed soon, потому что из-за этого могут грузиться неправильные версии библиотек.
Теперь полу-докер подменяет не просто io.open, а всю библиотеку filesystem и package - а это значит, что теперь загрузка модулей через require происходит внутри контейнера, как и должна!
Минус - некоторые программы могут крашиться. Баг-репорты принимаются, хоть здесь, хоть на гитхабе, хоть на гитлабе.
-
Ваша программа требует особую версию какой-нибудь библиотеки и мешается другим программам в системе? Опасаетесь, что необходимые библиотеки потеряются в истории? Надо разворачивать одно и то же окружение на много опенкомпов?*
Представляю вашему вниманию программу, позволяющая собрать программу и все её библиотеки в один файл!
wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/enum-files.lua
Программа, сохраняющая "образ" файловой системы компьютера, на котором запущена.
Чтобы не сохранять образ всей OpenOS, сохраняется только разность между корневой папкой и дискетой с чистой OpenOS. Путь к этой дискете необходимо прописать на строке 6.
Образ сохраняется по пути /home/archive.bin.
wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/unpack-files.lua
Программа, распаковывающая образ поверх файловой системы. Осторожно, не открывайте зловредные архивы, потому что они могут затереть даже EEPROM (указав путь для распаковки /dev/eeprom)!
wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/container.lua
Сам полу-докер - скрипт, позволяющий запустить программу с подменой её файловой системы на образ. Так как OpenOS не записывается в образ, этой программе тоже необходимо указать путь к дискете с чистой OpenOS.
Подменяется только io.open - to be fixed soon, потому что из-за этого могут грузиться неправильные версии библиотек.Образ является read-only - неясно, каким образом фиксить это.
*Kubernetes (для управления множеством контейнеров) в комплект поставки не входит.
-
6
-
-
Добавлена экспериментальная поддержка PNG!
Разумеется, обычная библиотека graffiti не подходит - нужно использовать патч, улучшающий производительность.
wget -fq https://gist.githubusercontent.com/ProgramCrafter/d1b279aec9e473794df115d1301dcb27/raw/9048fa36feaaedccecf54c7ae626174af17abb42/graffiti.lua /usr/lib/graffiti.lua
Картинка откопана на форуме)
-
3
-
-
9 часов назад, union сказал:ты о чем
О нарушении лицензии на код OpenComputers.
Программы, входящие в состав OpenComputers, распространяются по такой лицензии: https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/LICENSE
ЦитатаCopyright (c) 2013-2015 Florian "Sangar" Nücke Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- All images / textures and localization strings (resources) are put in the public domain. More specicially, see CC0 1.0 Universal: Код почти не был изменён по сравнению с https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/irc/usr/bin/irc.lua, но какая-либо пометка о лицензии, включая дисклеймер "AS IS", на https://pastebin.com/vjF5MSkR отсутствует.
Возможные пути поправить (чтобы не было просто хейтом):
- переписывать код с нуля /
- вставлять эту лицензию в каждый из выкладываемых файлов /
- собрать выкладываемые файлы в какой-нибудь репозиторий "OpenComputersLocalized" и поместить лицензию там.
-
1
-
1
-
OutStringStream, используемый в библиотеке, на добавление каждого символа пересобирает строку. Так как строки в Lua неизменяемы, это приводит к копированию строки O(n) раз, давая суммарную сложность O(n^2).
Альтернативная реализация, меньше страдающая от этого недостатка:
local outssmt = {} ----143 function outssmt:__call(write) self.buf[#self.buf + 1] = string.char(write) end function outssmt:__index(k) if k == 'str' then self._str = self._str .. table.concat(self.buf, '') self.buf = {} return self._str end return nil end function outssmt.OutStringStream() local outss = {_str="", buf={}} setmetatable(outss, outssmt) return outss end
-
1
-
-
Библиотека не может нормально считывать большие картинки (конкретно эта картинка 800x1100): https://i.waifu.pics/oRYkwh4.png
Выкидывает ошибку cannot perform arithmetic on a nil value: local 'dist_extrabits' (ну, или примерно так).
Я знаю, что для нормального считывания не хватит памяти, но библиотека работает всё равно некорректно.
Проблема в том, что большое изображение разбивается на куски IDAT, а либа (deflate на пару с libPNGimage) пытается каждый из кусков разархивировать по отдельности. В то время как в спецификации PNG (https://www.w3.org/TR/PNG/#11IDAT) сказано:
ЦитатаThe compressed datastream is then the concatenation of the contents of the data fields of all the IDAT chunks.
Скрытый текст
-
4 часа назад, eu_tomat сказал:То есть, можно справиться даже тремя планками из четырёх возможных, если использовать серверный корпус вместо обычного.
Попробую, хотя тестировать в майнкрафте пока затруднительно, а в оцелоте серверных стоек нет (буду ждать, когда появятся
).
4 часа назад, eu_tomat сказал:Заказ уборки мусора после каждой попытки отображения очередной картинки позволит поддерживать максимальный запас свободной памяти.
Это правда, но вся память нужна для каждого кадра и одновременно.
4 часа назад, eu_tomat сказал:Быстрый отказ от получения слишком больших картинок поможет программе не допускать нехватку памяти...
К сожалению, большинство картинок слишком большие.
4 часа назад, eu_tomat сказал:По возможности следует ориентироваться по данным HTTP-заголовка.
Да, я так и делаю. К счастью, сервер отдаёт Content-Length.
3 часа назад, Fingercomp сказал:Значение каждого входного пикселя делить на четыре
Для этого надо пиксель дробить на R,G,B составляющие. Поэтому пока затруднительно.
3 часа назад, Fingercomp сказал:в коде смешан snake_case и camelCase (причём в луа обычно юзают второе, не вижу смысла отходить от этого)
Я пытаюсь писать на всех языках в одном стиле.
Кстати, где там camelCase?
3 часа назад, Fingercomp сказал:busy-loop в ожидании finishConnect: читать пункт 3 и не насиловать процессор
to be fixed
3 часа назад, Fingercomp сказал:неудовлетворительная обработка ошибок (см. выше): на той же строке 75 следует хотя бы в assert обернуть stream.read
Функцию exact_readable вообще стоит вынести в отдельную библиотеку. Не делаю так потому, что каждый раз надо сбрасывать package.loaded.
3 часа назад, Fingercomp сказал:127 строка пугает
?
3 часа назад, Fingercomp сказал:каждый хендлер рисует пикчу, как вздумается
to be fixed
3 часа назад, Fingercomp сказал:(костыли с жпг непередаваемы)
16 часов назад, ProgramCrafter сказал:Проверяю на работу только GIF
Вид самой
библиотекипрограммы для отрисовки JPG тоже непередаваем.3 часа назад, Fingercomp сказал:спать один тик на каждый read звучит не очень здорово
Вроде read отдаёт максимум данных, сколько может (+ в заданном размере буфера)?
3 часа назад, Fingercomp сказал:насколько я могу судить, никакая из либ не требует бэктрекинга
Надо смотреть для каждой библиотеки использование метода seek - а желательно убирать перемотку вообще.
-
Все ошибки, которые есть в логе:
1. LuckPerms не может подключиться к БД, говоря, что слишком много соединений.
[04:53:40] [Server thread/ERROR]: [LuckPerms] Failed to init storage implementation java.sql.SQLTransientConnectionException: luckperms-hikari - Connection is not available, request timed out after 5000ms.
2. AuthMe тоже не может подключиться к БД.
[04:54:06] [Server thread/WARN]: java.sql.SQLNonTransientConnectionException: Too many connections
3. У CombatLogX неверный конфиг.
[04:54:07] [Server thread/WARN]: [CombatLogX] An I/O exception occurred while loading a configuration file: org.bukkit.configuration.InvalidConfigurationException: while parsing a block mapping in 'string', line 16, column 1: tag-command-list: ^ expected <block end>, but found '<block sequence start>' in 'string', line 18, column 4: - "[ИГРОК] говорит, что я в бою!" ^4. PinPrompt не может подключиться к БД.
[04:54:10] [Server thread/WARN]: [Server thread] INFO me.hexedhero.ppt.shaded.hikari.HikariDataSource - HikariPool-1 - Starting... [04:54:11] [Server thread/WARN]: java.sql.SQLNonTransientConnectionException: Too many connections
5. UTitleAuth не загрузился.
[04:54:11] [Server thread/ERROR]: Error occurred while enabling UTitleAuth v4.2 (Is it up to date?) java.lang.IllegalStateException: zip file closed
6. SCore не загрузился.
[04:54:11] [Server thread/ERROR]: Error occurred while enabling SCore v3.2.0 (Is it up to date?) java.lang.NoClassDefFoundError: com/mysql/jdbc/jdbc2/optional/MysqlDataSource
7. ExecutableItems не загрузился.
[04:54:11] [Server thread/ERROR]: Error occurred while enabling ExecutableItems v5.2.0 (Is it up to date?) java.lang.NoClassDefFoundError: com/ssomar/score/sobject/NewSObject
А после всего этого сервер корректно завершился.
-
2
-
-
Насчёт потребления памяти: вот расчёт, на что как минимум нужна память, в случае GIF.
- 270 КБ ест сама OpenOS с загрузки;
- + 350 КБ жрут библиотеки graffiti и gif при загрузке через require;
- + 1500 КБ занимает файл картинки;
- + 150 КБ уходит на буфер для одного кадра (строка длиной 500*300 в случае GIF);
- + (сколько-то, >=250, скорее всего) КБ нужно в качестве накладных расходов на декодер.
В сумме получается 2520 КБ, что существенно больше 2048 КБ - двух планок тир3,5 памяти.
Возможные пути обхода:
-
Избавиться от зависимости от OpenOS.
- программе нужны библиотеки serialization и event (обе для отладки),
- отрисовщик загружает библиотеки (graffiti, gif) из интернета с помощью wget,
- wget тянет зависимостями библиотеки filesystem, internet, shell и text,
- отрисовщик сохраняет файл в tmpfs и использует для этого io.open... -
Не грузить библиотеки заранее.
- тогда в "решающий момент" (когда попадётся картинка с другим форматом) пользователь будет ждать, когда загрузится кодек -
Не хранить в памяти файл картинки.
- невозможно из-за того, что gif.lua использует seek, и нет возможности перемотать (особенно назад) поток из интернета -
Уменьшить накладные расходы на декодер.
- надо разбираться в коде каждой библиотеки -
Складывать картинку на диск.
- в tmpfs не влезает, поэтому придётся использовать обычный диск,
- а если диск забит? с обычными настройками алмазный диск всего 4 МБ, и этого хватит всего на три картинки.

Подмена ID компьютера.
в Сетевые технологии
Опубликовано:
ComputerCraft использует для получения ID компьютера os.getComputerID изнутри песочницы?
И данные компьютера действительно сохраняются в другую папку?
Т.е., если сделать ID ../../../etc/ (не учитывая то, что ID числовые, конечно), то можно будет считать файл passwd из системы?