Fingercomp
Гуру-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Fingercomp
-
На новой версии эксплоит не работает. Это я проверил. По поводу невозможности перехвата: ошибся. Не так прочёл код. Приношу извинения. Отловить можно. Но после неё частично теряется информация о месте выброса ошибки. То есть обработчик ошибки вызывается снаружи функции, ошибку выбросившую. Впрочем, если честно, её и раньше я никогда не видел, поэтому можно не паниковать. Как видно, стэк показывает не на вайл-тру-ду, откуда хука выбросила TLWY, а, если отсечь кишки, только на наш вызов xpcall. Ещё раз сорри. Поправлю ща.
-
Нет, это другие баги.
-
О прошлой версии я умолчал, но исправляюсь. Вышла 1.7.5 с чаем и сладкими фичами. Новинки Анализатор, которым адреса компонентов получаем, теперь вставляется в планшет. Он займёт компонент barcode_reader, но методов у него нет. Зато он вернёт в ивенте tablet_use адреса и типы всех компонентов внутри блока, если планшетом нажать на него и удерживать до писка. Известно, что в компы вставлять можно любой объём текста не более 256 строк. Дело в том, что из-за ошибки каждая строка отсылает отдельное событие clipboard, а на компьютере есть лимит очереди необработанных сообщений. Равный 256. Поэтому остальные строки отбрасываются. Теперь этот лимит можно менять в конфиге. В internet.request разрешили использовать экзотические HTTP-методы вроде PUT. Ангельские апгрейды, которые позволяют ставить блоки без опоры, теперь вставляются в дронов. Наконец-то. [MC 1.12] Зарядники заряжают предметы в инвентаре игрока рядом с ним. Апгрейд опыта показывает уровень прокачки ещё и в тултипе. [MC 1.12] Если банки с эссенцией из Thaumcraft просканировать через контроллер инвентаря, то добавляется информация о том, что за ссенция в ней находится. [MC 1.12] Поддержка многожильных кабелей из SimpleLogic. [MC 1.12] Поддержка WE-CBE. [MC 1.12] Изменено Вокруг экрана не будет рамки, если не приседать. Добавлено ещё сколько-то имён для роботов. Обновлён китайский перевод мануала. Поменяны некоторые комментарии в конфиге. gpu.bind работает быстрее. В computer.pushSignal можно пихать таблицы! Кроме вложенных. Сделана более логичной нумерация уровней APU. Она соответствует теперь уровню процессора в нём. В RAID все диски переключаются в режим с ФС при вставке. Ну и форматируются, конечно. Починено Роботы научились черпать вёдрами. Очередной дюп жидкости. Два даже. Модемы T2 ловят и проводные сообщения, наконец-то. robot.swing правильно рапортует статус, даже если блок крушится очень быстро. Сообщения между серверами серверной стойки передавались медленно и неторопливо. Реле правильно показывают проходящий трафик. Всякие проблемы с передачей сообщений через реле. Если itemDamageRate поставить в 0, роботы теперь вообще не будут ломать инструмент. Краш из-за hologram.copy. Метод isSunVisible геолайзера на планшете теперь таки работает. Раньше true возвращал всегда. Краш из-за удалённых терминалов. Робот без инвентаря дропнутые предметы сжирал и не давился. TLWY не выкидывался, когда надо было. Можно было сервер положить. Теперь эту ошибку нельзя перехватить в pcall/xpcall. См. коммент об изменении в поведении xpcall. Краш при взрыве работающего компьютера. С включённым LuaJ не все архитектуры были доступны. Краши, баги, недочёты с AE2. Краш с IC2 Classic. Изменения в OpenOS Ошибки, связанные с установкой oppm. Таймеры не вызывались во время event.pull. Команда reset ставит максимальное разрешение экрана. Фиксы в либе vt100. Добротно падает, если принтить объекты с недоброкачественным метаметодом __tostring. Стоит отметить, что OpenComputers больше не будет обновляться для версии MC 1.11.2. На 1.7.10, 1.10.2 и 1.12.2 всё останется по-прежнему. Впрочем, более половины новых фич только для 1.12.2. Качать можно отсюда.
-
tmpfs — это тоже filesystem. И да, список может поменяться на каждом ребуте.
- 6 ответов
-
- 1
-
-
- exists
- file check
-
(и ещё 2 )
Теги:
-
Картинка с восклицательным знаком.
-
Такие проги сродни hello world: их должен велосипедить и костылять каждый сам, я считаю. Выложил в репу, чтобы не потерять. Ну, ещё там интерфейс консольный поудобнее и нет ограничения в 4 киБ.
-
Кодить код вне git-репозитория.
-
От 20 таблиц даже планка T1 не закончится. Рациональный вариант надо подбирать исходя из требуемых задач. Например, самый простой в использовании и поддержке вариант — это сериализация. Самый эффективный по памяти и размеру БД — свой формат через string.pack. И т. д. Вообще, это уже в оффтопик уходит.
-
Прочесть весь файл, десериализовать всю таблицу, добавить новое значение, сериализовать обратно и перезаписать. local srl = require("serialization") local f = io.open(path, "r") local tbls = srl.deserialize(f:read("*a")) f:close() table.insert(tbls, {...}) -- если внезапно вылетит ошибка здесь, файл не будет потёрт local serialized = srl.serialize(tbls) local f = io.open(path, "w") f:write(serialized) f:close()
-
Это параметр, который говорит прочитать всё из файла. Нет, зачем? Достаточно поместить все таблицы в одну и её уже сериализовать. А искать можно и линейным поиском. local itemToCraft = {id = "IC2:blockGenerator", dmg = 3} local tbls = srl.unserialize(f:read("*a")) local recipe for _, tbl in pairs(tbls) do if (tbl.craft.id == itemToCraft.id and tbl.craft.dmg == itemToCraft.dmg) then recipe = tbl break end end assert(recipe, "recipe not found")
-
Да, в данном случае проще всего будет использовать serialization. Только вот использование некорректное. local srl = require("serialization") local solar = { craft = {id = "IC2:blockGenerator", dmg = 3}; {id = "minecraft:cobblestone", dmg = 0, qty = 11}, {id="IC2:itemIngot", dmg = 1, qty = 3}, {id="minecraft:coal", dmg = 0, qty = 3}, {id="minecraft:redstone", dmg = 0, qty = 6}, {id="IC2:itemRubber", dmg = 0, qty = 13}, {id="IC2:itemIngot", dmg = 0, qty = 4}, {id="minecraft:iron_ingot", dmg = 0, qty = 10} } -- Запись local f = io.open("/tmp/recipe.tbl", "w") f:write(srl.serialize(solar)) f:close() -- Чтение local f = io.open("/tmp/recipe.tbl", "r") local tbl = srl.unserialize(f:read("*a")) f:close() print(tbl.craft.id, tbl.craft.dmg) print(tbl[2].id, tbl[2].dmg, tbl[2].qty) Как видно, спокойно можно сериализовать вложенные таблицы и затем к ним обращаться после десериализации.
-
Файл — последовательность байтов. Кроме них ничего записать в него невозможно. Осмысленность этой последовательности придаёт формат — соглашённость о том, как представлять некий вид информации в байтах и как оттуда его считывать. В данном случае нужно подобрать формат для таблицы и записывать в нём. Так как в вопросе не дана структура этой таблицы, то могу только перечислить инструменты, которыми можно воспользоваться. Либа serialization (OpenOS). Сериализует таблицу и десериализует в таблицу назад. Функции string.pack и string.unpack. Первая по строке-формату пакует данные в строку, вторая их извлекает. Функции string.char и string.byte. Первая создаёт строку с байтом, значение которого равно переданному; вторая возвращает значения байтов, из которых состоит строка. Функции string.gsub, string.gmatch, string.find, string.match. Для поиска по шаблону. Прошу описать структуру содержимого таблицы, чтобы помочь подобрать правильный инструмент. Кроме того, чтобы файл не переписывать с нуля, а дописывать с конца, нужно использовать io.open(path, "a") (от append).
-
Не фигачь строку по одному символу. Используй string.find, чтобы найти позицию последовательности смены цвета. Паттерн — "%[0x(%x%x%x%x%x%x)]". Вернёт позицию начала, конца и цвет. local unicode = require("unicode") local s = "test[0x123456]testtest[0x654321]spameggs" local pattern = "%[0x(%x%x%x%x%x%x)]" local begin = 1 local x, y = 1, 1 while true do local b, e, color = s:find(pattern, begin) local precedingString = s:sub(begin, b and (b - 1)) if precedingString then gpu.set(x, y, precedingString) x = x + unicode.wlen(precedingString) end if not color then break end gpu.setForeground(tonumber(color, 16)) begin = e + 1 end
- 1 ответ
-
- 6
-
-
-
Обе вики не обновляются. Если хочешь что-то более-менее серьёзное делать, то читай код. В server/component, common/component находятся scala-файлы. Все методы, помеченные через @Callback, доступны из Lua-кода. Ещё стоит заглянуть в server/machine/Machine.scala, где есть методы компонента computer, integration, где лежат драйверы для разных штук из разных модов (в т. ч. OpenComputers) лежат, и в machine.lua, который запускается при старте компьютера, готовит песочницу и запускает в ней BIOS. Если что-то неясно, то задавай вопросы. Тут, в ирке, в дискорде — где угодно. (Когда @Asior спрашивает что-то по OpenComputers, то я обычно как раз прочитываю код и отвечаю.) Конечно, экспериментальное изучение тоже не запрещено, если не лень тыкать методы компонента (components -l robot, напоминаю). И учи английский. С гугл-переводчиком ты код не прочтёшь.
-
Да, с radioegor146 мы это в ирке обсуждали пару дней. С версии 1.7.3 в OC включён коммит https://github.com/MightyPirates/OpenComputers/commit/4010927a3ee04700d80fdeade705fca885bc7c92. Пока не разобрались, что там не так, можно откатить его и собрать мод без него.
-
Почему рейтинг ответов работает в StackOverflow, но не здесь? Причин несколько. На SO под вопросом и под ответами можно оставлять комментарии. Они позволяют обсудить другим юзерам ответ или дозадать вопросы недостающие. На SO жёсткая модерация. Один топик — один вопрос, никак иначе. Дубликаты удаляются. Некачественные вопросы и ответы минусуются. Кроме того, (некоторые) юзеры могут редактировать чужие ответы, что снижает флуд. Помимо комментариев и собственно ответов, есть у каждого вопроса чат. Там проводятся некритические для понимания обсуждения. Флуд из комментариев, который не несёт ценности (прояснения вопроса или указания на неточности ответа), модераторами сносится в чат. На форуме вопросы скатываются в 10 реплик — попыток добиться от вопрошающего сути его же проблемы, затем ещё 3 поста — разного качества ответы, а потом топикстартер задаёт другой, совершенно не пересекающийся с основным вопрос («Ах, да, раз уж мы о роботах говорим, скажите, а почему…»), и всё повторяется. Я, конечно, гиперболизирую. Но ясно, что сортировка по голосам на форуме работать в текущем виде не может.
-
Да, действительно. Вместо U+FEFF, который BOM означает, рекомендуют использовать U+2060 WORD JOINER. Но если встретится U+FEFF в середине текста, его надо обрабатывать как неразрывный ZWS. ...И ведь я раньше, когда искал этот символ, точно так же натыкался на U+2060 и использовал его. Память — жестоко ненадёжная, всё-таки, штука.
-
Насколько я понимаю, в OpenGlasses 2 можно в очки встроить геолизатор и апгрейд навигации, после чего на стороне моста вызывать getUserLookingAt(username: string) и получать в таблице под ключами x, y, z координаты блока. Клик регистрируется ивентами interact_world{,_block}_{right, left}. Но, пожалуй, для интерфейса проще даже рисовать на оверлее: кликать можно курсором, как в любом другом гуи.
- 2 ответа
-
- 2
-
-
- ray tracing
- интерактивность
- (и ещё 1 )
-
Возьмём недавний пост. Нас приглашают ввести команду. Вводим — и получаем какую-то абракадабру, программа не качается, и, вообще, печалька какая-то. А теперь копируем и вставляем в xxd: $ xclip -selection primary -o | xxd - 00000000: 6874 7470 73ef bbbf 3a2f 2f72 6177 2e67 https...://raw.g 00000010: 6974 6875 6275 7365 7263 6f6e 7465 6e74 ithubusercontent 00000020: 2e63 6f6d 2f68 6f68 7365 7267 312f 4f70 .com/hohserg1/Op 00000030: 656e 436f 6d70 7574 6572 7350 726f 6772 enComputersProgr 00000040: 616d 73ef bbbf 2f6d 6173 7465 722f 706c ams.../master/pl 00000050: 6179 6572 6c6f 6f6b efbb bf2f 676c 6173 ayerlook.../glas 00000060: 7365 73ef bbbf 2eef bbbf 6c75 61ef bbbf ses.......lua... 00000070: efbb bf Сказать, что я был ошарашен, — не сказать ничего. По какой-то причине в скопированной ссылке затесались неопознанные летающие байты EF BB BF. Вставляем в vim, который услужливо их опознаёт как U+FEFF. Это очень знакомый для меня символ, потому что им разбивают ники в IRC, чтобы не отослать случайный mention юзерам: 15:09:37 <@fingercomp> .u U+FEFF 15:09:37 <@brote> U+FEFF ZERO WIDTH NO-BREAK SPACE () Да, это неразрывный ZWS. (Нет, это BOM, который обрабатывается как ZWS. Для нормального ZWS надо использовать U+2060 WORD JOINER.) На вид ожидаемо не влияет, но потому приносит жуткие страдания тем, кто не настолько шарит в юникоде и просто хочет запустить программу, — то есть целевой аудитории, насколько я могу понять. Зачем это сделано? Если причины нет, хотелось бы устранения этих диверсантов.
-
Ограничение памяти можно осуществить и в ванильном луа, если сделать свой аллокатор и передать его луа (она это умеет, что очень её красит). Персистентность из Eris для этого не нужна.
- 4 ответа
-
- 3
-
-
-
Извините за скептицизм. Я не особо понял, чем эта тема от отличается. И вообще, надо какие-то действия дальше подбора лого и имени делать: код писать, спеки делать; пустые идеи ничего не стоят.
-
Логирование можно и в ванильном OC сделать, если в сэндбокс пропустить print из machine.lua. Но да, отдельный интерфейс был бы полезен. Дебаггер, профилятор и что там ещё на свете ни придумали.
-
Минификатор занимается тем, что из кода делает эквивалентный, но короче в записи. Инлайнинг переменных — круто, но код будет не эквивалентный. С помощью debug.getlocal/debug.setlocal если попытаться прочесть эту переменную, можно очень удивиться, что её нет. То, что описывается, есть работа оптимизатора. Одного синтаксического дерева недостаточно. Нужно провести хотя бы data-flow analysis, чтобы сначала заинлайнить константу, а потом удалить мёртвый код.
-
Чтобы не париться с автоотрубанием листнеров, регистрируй их в треде.
-
Не знаю, по какому принципу следует, что Lua и OpenComputers надо писать орущим капсом, но оставим это в стороне. Если хочешь быстрее всего, то делай в памяти таблицу обычную. Когда заканчиваешь транзакцию, записываешь на диск. А при старте проги читаешь оттуда.
