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

ProgramCrafter

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

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

  • Посещение

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

    41

Все публикации пользователя ProgramCrafter

  1. О нарушении лицензии на код OpenComputers. Программы, входящие в состав OpenComputers, распространяются по такой лицензии: https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/LICENSE Код почти не был изменён по сравнению с 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" и поместить лицензию там.
  2. 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
  3. Пролистал RFC7230. Как ни странно, не нашёл там указаний на то, что после отправки сообщения сервер не может по тому же соединению отправлять ещё бессмысленный мусор. А если Content-Length меньше длины полученных данных, то не указано, корректный это заголовок или нет. А вообще, получается так: если сервер, например, решит "а я не буду закрывать соединение после отправки сообщения", то программа будет висеть, пока это соединение не разорвётся чем-нибудь посередине. Плюс сервер (доверять которому обычно не надо бы) может заставить программу на Lua использовать произвольное количество памяти. Не совсем best practices, по-моему
  4. Библиотека не может нормально считывать большие картинки (конкретно эта картинка 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) сказано:
  5. Попробую, хотя тестировать в майнкрафте пока затруднительно, а в оцелоте серверных стоек нет (буду ждать, когда появятся ). Это правда, но вся память нужна для каждого кадра и одновременно. К сожалению, большинство картинок слишком большие. Да, я так и делаю. К счастью, сервер отдаёт Content-Length. Для этого надо пиксель дробить на R,G,B составляющие. Поэтому пока затруднительно. Я пытаюсь писать на всех языках в одном стиле. Кстати, где там camelCase? to be fixed Функцию exact_readable вообще стоит вынести в отдельную библиотеку. Не делаю так потому, что каждый раз надо сбрасывать package.loaded. ? to be fixed Вид самой библиотеки программы для отрисовки JPG тоже непередаваем. Вроде read отдаёт максимум данных, сколько может (+ в заданном размере буфера)? Надо смотреть для каждой библиотеки использование метода seek - а желательно убирать перемотку вообще.
  6. Уменьшаем счётчик на единицу. Претензия к пункту 3.3. Программа читает столько данных, сколько может - если сервер укажет маленький Content-Length и отправит гигабайт данных, программа всё это будет читать.
  7. Все ошибки, которые есть в логе: 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 А после всего этого сервер корректно завершился.
  8. Насчёт потребления памяти: вот расчёт, на что как минимум нужна память, в случае 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 МБ, и этого хватит всего на три картинки.
  9. Можно ждать клика нулевое время. Тогда pull_e вернёт либо nil, либо событие клика. Вот пример: ... local tEvent = {pull_e(0, 'touch')} if tEvent[1] then for i = 1, #tButtons do if tButtons.visible then if tEvent[3] >= tButtons.X and tEvent[3] <= tButtons.X+tButtons.W and tEvent[4] >= tButtons.Y and tEvent[4] <= tButtons.Y+tButtons.H then blink(i) tButtons.action() break end end end end ...
  10. Секрет на самом деле простой : отредактировать настройки майнкрафта или оцелота. Я утроил размер одной планки памяти и у меня работает всё стабильно. С меньшим количеством памяти будет гарантированно хуже, потому что я не особо понимаю, куда деть одновременно загруженный файл (в виде строки в памяти), картинку (массив чисел - цветов) и палитру. Строки 238-245 конфига: ramSizes: [ 576 768 1152 1536 2304 3072 ]
  11. Программа умеет получать картинки по ссылке и отрисовывать их в OpenComputers. Поддерживается примитивный даунскейлинг. wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/images-drawer/draw-random-img.lua Работа всё ещё в процессе. На данный момент: 1. Проверяю на работу только GIF. 2. Некоторые GIF некорректно парсятся по вине библиотеки. 3. К библиотеке GIF нужен патч, чтобы хоть какие-то гифки показывались. wget -fq https://gist.githubusercontent.com/ProgramCrafter/d1b279aec9e473794df115d1301dcb27/raw/8166f23ee3daba8ca8ec305589b3d9a258f6674f/gif.lua /usr/lib/gif.lua 4. Даунскейлинг примитивный: если картинку надо уменьшить, то из каждого квадрата 2x2 пикселя выбирается левый верхний. 5. Требования: тир3 GPU и монитор, интернет-карта, 6 планок тир3,5 памяти. Используемые библиотеки: Зато результат неплохой:
  12. Не везде. Вижу часто 2^count. Ещё есть баг, что для больших картинок нижняя часть съезжает - некорректно декодируется. Послал PR с фиксом. Протестить можно на прикреплённой картинке.
  13. Баг-репорт: программа не вызывает sleep, а найти нужные места для вставки os.sleep(0) не представляется возможным из-за стиля кода.
  14. local eeprom = require 'component'.eeprom eeprom.set'' eeprom.setData'' eeprom.setLabel'' eeprom.makeReadonly(eeprom.getChecksum())
  15. А какое разрешение получается в итоге? Правильно понимаю, что там просто построчно запись RGB для каждого пикселя? Кстати, планируется поддержка OpenComputers или не планируется?
  16. Видимо, то, что ls /home не будет показывать программу, а будет показывать только созданные пользователем файлы. Я всё-таки предпочту давать пользователю выбор: пусть куда хочет, туда и ставит. Если юзеру важно, куда именно прога скачается - пусть пишет mkdir /usr/bin && cd /usr/bin , благо программы обычно не очень часто ставятся. Может, этот пользователь захочет вовсе в /bin программу поставить.
  17. Можно, вроде там какой-то специальный блок был для взаимодействия с OpenComputers.
  18. Допустим, есть компьютеры A и B, в каждом по сетевой плате (с адресами AAA и BBB), и они соединены проводами. Надо выбрать порт для передачи сообщений - число от 1 до 65535. Затем на сетевой карте приёмника необходимо открыть этот порт (работает до перезагрузки или до закрытия порта): local modemB = require 'component'.modem modemB.open(<открываемый порт>) Теперь с компьютера A можно посылать сообщения - либо широковещательные (всем в сети), либо адресные (кому-то конкретному). local modemA = require 'component'.modem modemA.send('<адрес B>', <выбранный порт>, <данные...>) -- или modemA.broadcast(<порт>, <данные...>) На компьютере B начнут появляться события modem_message, и их можно посмотреть программой dmesg. Как поймать их кодом: local evt = require 'event' local _, receiver, sender, port, distance, data = evt.pull 'modem_message' print(sender, '->', data) Дальше к этому можно прикрепить evt.listen, в зависимости от задачи. Можно сделать автозакрытие порта по выходу из программы, хотя этого я ни разу вроде не видел. Полезные ссылки: https://ocdoc.cil.li/component:modem - API сетевой карты; https://ocdoc.cil.li/component:signals - сигналы компонентов.
  19. А есть примеры, чтобы это получилось? У меня есть подозрение, что если MineOS сломается, то сразу уж до синего экрана. Вообще, Lua 5.2 тоже полезная вещь. Как минимум, пока в 5.3 не пофиксили баги при передаче таблиц компонентам.
  20. Кстати, я на этом сервере видел, что три блока портала уничтожились, а три другие - нет. Но это произошло от выстрела гаста. У меня иногда не все скрафченные ресурсы показываются, получается чуть меньше предметов в стаке, чем должно быть. Обычно, когда связь не очень хорошая. Вообще, надо бы проверить, что шлёт сервер, запустив Майнкрафт через логгер-прокси. А то окажется, что баги-то в клиенте.
  21. Да, пока только по коду. Включить сюда и таблицу символов можно, но это уже к переработке интерфейса. Сделано. (Кстати, теперь программа стала поддерживать тир2 мониторы. )
  22. Если кому интересно, как я нашёл уязвимость с TLWY: В Cynosure есть файл /dev/base/load.lua: https://github.com/Ocawesome101/oc-cynosure/blob/dev/base/load.lua А там есть набор паттернов, которые говорят, куда вставлять yield. ... local patterns = { --[[ { "if([ %(])(.-)([ %)])then([ \n])", "if%1%2%3then%4__internal_yield() " }, { "elseif([ %(])(.-)([ %)])then([ \n])", "elseif%1%2%3then%4__internal_yield() " }, { "([ \n])else([ \n])", "%1else%2__internal_yield() " },--]] { "([%);\n ])do([ \n%(])", "%1do%2__internal_yield() "}, { "([%);\n ])repeat([ \n%(])", "%1repeat%2__internal_yield() " }, } ... Как говорится, если у вас есть проблема и вы используете регулярные выражения, то у вас есть две проблемы...
  23. ProgramCrafter

    IconPaint

    Мониторы в OpenComputers поддерживают только текстовый режим, но интерфейс можно сделать круче с помощью символов из Юникода. До недавних пор символы приходилось выбирать из таблицы (https://computercraft.ru/topic/1962-shrift-v-oc/) и вручную проверять на то, подойдут ли они в интерфейс или иконку. Но сейчас я представляю вам IconPaint - программу, позволяющую интерактивно менять символы внутри иконки и сразу видеть результат! Как скачать: wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/paint/paint.lua Управление такое: стрелки на клавиатуре выбирают редактируемый символ (справа подсвечивается синим), backspace, цифры и буквы a-f служат для редактирования шестнадцатеричного кода символа, клик левой кнопкой мыши по палитре задаст редактируемому символу такой же цвет текста, клик правой - цвет фона, выход по Ctrl-C; проделанная работа сохраняется в файл paint.dat. Пример paint.dat (осторожно, это валидный код на Lua, и при загрузке IconPaint запускает его, хоть и в ограниченном окружении): data = { {0x0020, 0x2580, 0x2580, 0x2580, 0x2580, 0x2580, 0x2580, 0x0020}, {0x0020, 0x0020, 0xE18B, 0xE146, 0xE147, 0xE18C, 0x0020, 0x0020}, {0x0020, 0x0020, 0xE18E, 0xE149, 0xE148, 0xE18D, 0x0020, 0x0020}, {0x0020, 0x2584, 0x2584, 0x2584, 0x2584, 0x2584, 0x2584, 0x0020} } overlay = {["2 3"]={16777215,2960685,2,3},["3 3"]={6684927,0,3,3},["4 3"]={16777215,6684927,4,3},["5 3"]={16777215,6684927,5,3},["7 2"]={16777215,2960685,7,2},["7 3"]={0,2960685,7,3},["3 4"]={0,2960685,3,4},["2 4"]={0,2960685,2,4},["5 4"]={0,2960685,5,4},["4 4"]={0,2960685,4,4},["7 4"]={0,2960685,7,4},["6 4"]={0,2960685,6,4},["6 1"]={0,2960685,6,1},["5 1"]={0,2960685,5,1},["4 1"]={0,2960685,4,1},["3 1"]={0,2960685,3,1},["2 1"]={0,2960685,2,1},["5 2"]={16777215,6684927,5,2},["6 2"]={6684927,0,6,2},["3 2"]={6684927,0,3,2},["4 2"]={16777215,6684927,4,2},["2 2"]={16777215,2960685,2,2},["6 3"]={6684927,0,6,3},["7 1"]={0,2960685,7,1}} Что в планах: расширить зону для редактирования иконки (сейчас 8x4 символа), добавить вставку символов из буфера обмена. Скриншот под спойлером:
  24. root@localhost: /# df fs name total used free f1fff042 OpenOS 2097152 862293 1234859 ... root@localhost: /# mount f1fff042 /mnt root@localhost: /# cd mnt root@localhost: /mnt# edit something.lua
  25. root@localhost: /# lua Lua 5.3 Copyright (C) 1994-2020 Lua.org, PUC-Rio > while{}do end too long without yielding stack traceback: [C]: in function 'pcall' machine:809: in global 'xpcall' /bin/lua.lua:122: in upvalue 'ok' mtarfs:/boot/cynosure.lua:2897: in function <mtarfs:/boot/cynosure.lua:2877> ...
×
×
  • Создать...