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

Лидеры


Популярный контент

Показан контент с высокой репутацией 05.06.2020 во всех областях

  1. 3 балла
    На всякий случай, если кто-то захочет скачать библиотеку, выкладываю свой, исправленный и работающий на новых версиях вариант Помимо исправления некоторых ошибок, добавил ссылку на зеркало Телеграма - теперь проблем с блокировками быть не должно Ссылка Команда для установки (с зависимостями): pastebin get 4XB9FdRH -f /lib/Telegram.lua; pastebin get 4Lh9ALEY /lib/Promise.lua; pastebin get ji28sbxU /lib/JSON.lua;
  2. 2 балла
    Отлично пашет, за полчаса ковыряния нашёл всего лишь два явных бага: Нет реакции на скроллинг мышью. В списке ивентов через dmesg не высвечивается Некорректно работает computer.maxEnergy(), возвращая math.huge вместо фикисированного числа. В нативных опенкомпах при отключенном поглощении энергии в конфиге (или при отсутствии энерго-модов) функция всегда возвращала 500 Еще было бы крайне приятно, если бы окошечки экранов можно было ресайзить, т.к. более 2х виртуальных экранов даже на WQHD-монитор не влезет. В идеале - вообще группировать их с изменением масштаба в автоматическом режиме плитками а-ля Snap Assist. Но это жир
  3. 1 балл
    Установка pastebin get c1v8T9CK /lib/Telegram.lua; pastebin get 4Lh9ALEY /lib/Promise.lua;pastebin get ji28sbxU /lib/JSON.lua Создание бота Здесь все подробно обьясняют: https://tlgrm.ru/docs/bots#botfather. Документация Эта библиотека возвращает одну-единственную функцию - Telegram (в либе названа Bot, но будет телеграмом) Telegram(token: string) - создает обьект бота. Использует псевдо-ООП. Bot.API - таблица с единственным полем rawRequest(method: string, options: table): table - сырой запрос без оболочек. Имеет метатаблицу. Bot.API[method](options) - возвращает промис. Promise:next(onFulfilled:function) - установить функцию, принимающая значение result при успешном выполнении промиса. Promise:catch(onRejected:function) - установить функцию, принимающая значение error при ошибке промиса. Promise:await() - ждет завершения промиса и возвращает результат с учетом всех его обработчиков. Bot.longpoll on(event: string,callback: function) - установить обработчик ивента. Весь список - message, edited_message, channel_post, edited_channel_post, inline_query, chosen_inline_result, callback_query, shipping_query, pre_checkout_query start() - запустить лонгполл. Программа блокируется. stop() - остановить. Возможно, библиотека будет не очень хорошо работать, но я тупо не могу ее адекватно протестировать - вебпрокси (закомментированная 7я строка) перестал работать (только для меня xD) P.s. если у вас тоже выбивает ошибку на 30й строке - напишите. component.internet.request тупо льет nil вместо ошибки, я пока полагаю, что это связано с блокировками.
  4. 1 балл
    https://cc-ru.gitlab.io/ocelot/ocelot-desktop/ocelot.jar
  5. 1 балл
    В прошлый раз я патчил OpenComputers, чтобы пробрасывать нативную либу debug. Пойдём дальше. Добавим нативных либ package и os. Прокинем дефолтное окружение внутрь песочницы. Пропатчим мод, чтобы можно было загружать си-модули. Загрузим профилятор и посмотрим, что из этого вышло. На винде ничего не заработает. Гарантирую. Если надо профилировать, ставьте нормальные оси или мучайтесь. 0. Сырцы мода Так как мы будем патчить мод, надо сначала подготовить исходники. $ git clone https://github.com/MightyPirates/OpenComputers.git $ cd OpenComputers $ git checkout master-MC1.12 $ ./gradlew setupDecompWorkspace На третьей строке версию выбираем по вкусу и выпекаем всё необходимое для компиляции. 1. Нативные либы Здесь всё просто. Открываем файл src/main/scala/li/cil/oc/server/machine/luac/LuaStateFactory.scala. Творим следующее: Вуаля. Теперь в machine.lua будут глобальные переменные package и _os. Отмечу отдельно, что меняем мы только архитектуру Lua 5.3. Уже на этом этапе у нас может сломаться персистентность. Это не страшно: она и должна сломаться. 2. Прокидываем окружение Поступаем аналогично тому, что делали в прошлой записи: меняем src/main/resources/assets/opencomputers/lua/machine.lua: Внутри песочницы в глобальной переменной env запечатлено будет всё окружение machine.lua. 3. C-модули Уже сейчас можно загрузить OpenOS и прописать env.require("libname"). Проблема в том, что C-модули так подключить не получится. Связано это с особенностью Lua. Абстрактно задача заключается в том, чтобы загрузить библиотку Lua с dlopen(..., RTLD_GLOBAL). System.loadLibrary в жаве флаг этот упускает по очевидным причинам, а нам он нужен. Значит, пришло время костылей. 3.1. Подключаем JNA: build.gradle Первый ханк нужен, чтобы можно было потом компилировать мод. Почему-то у курсов мавен не работает, а разбираться мне лень. 3.2. Патчим ещё раз src/main/scala/li/cil/oc/server/machine/luac/LuaStateFactory.scala Во-первых, подключаем хэшмапу. Потребуется. Во-вторых, импортируем JNA. Вернее, его часть. В-третьих, патчим код, чтобы он загружал Lua 5.3 через JNA. Магическая константа 0x101 — это значение RTLD_LAZY | RTLD_GLOBAL на моей системе. На фряхе, маке оно может отличаться. На этом этапе Lua 5.2 не будет работать. Включаться будет только Lua 5.3 из-за конфликта имён. Кроме того, JNA — это, вообще, огромная либа. Ради одной функции её подключать — это оверкилл. Но я в тонкостях JVM и JNI не силён. Как уже сказал, разбираться мне лень. 3.3. Компилируем $ ./gradlew assemble Выхлоп в build/libs. Берём жарник без суффиксов вроде -javadoc, -api, -sources. 4. Настраиваем профилятор Профилятор я написал сам на Rust. Вот ссылка: https://github.com/Fingercomp/lprofile-rs Очевидно, нам надо его скомпилировать. 4.1. Компилируем профилятор Ставим cargo (мультитул раста такой) любым удобным способом. Собираем: $ cd .. $ git clone --recurse-submodules https://github.com/Fingercomp/lprofile-rs.git $ cd lprofile-rs $ cargo build --release В target/release будет лежать liblprofile.so. Тырим его. 4.2. Определяем pwd Кидаем пропатченный OC в моды и запускаем игру. Пишем в опенкомпе env._os.getenv("PWD"), чтобы определить текущую директорию. Кидаем либу-профилятор в неё. 4.3. Профилируем Наконец, можно заняться мясом. local profiler = env.require("lprofile").Profiler() local result = profiler(function() local v = 0 for i = 1, 10e6, 1 do v = v + i end end) table.sort(result, function(lhs, rhs) return lhs.totalTime < rhs.totalTime end) print("Name", "# of calls", "Total time", "Total time, excluding inner calls") for _, v in ipairs(result) do print(("%s\t%d\t%.6f s\t%.6f s"):format(v.name, v.calls, v.totalTime, v.totalSelfTime)) end print("total time:", result.totalTime) 5. Зачем Мы получили наполовину сломанную версию OpenComputers: без Lua 5.3, без персистентности. Зато можем профилировать программы. Этот пост я написал, чтобы не забыть самому. Сомневаюсь, что кому-то интересно заниматься такой норкомагией.
  6. 1 балл
  7. 1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...