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

Fingercomp

Гуру
  • Публикации

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

  • Посещение

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

    283

Записи блога, опубликованные пользователем Fingercomp

  1. Fingercomp
    Начну со слов автора мода: "давайте будем считать, что кандидата к релизу не было. Не потому, что он был сломан, нет. Просто я добавил несколько вещей, которые требуют тестирования, поэтому у нас снова будет бета".
     
    Изменения
    ДобавленоНовая функция computer.getDeviceInfo() теперь возвращает список всех компонентов, имеющихся у устройства, включая планки памяти, процессоры и пр. Для показа их в OpenOS есть теперь команда lshw.
    [*]Изменено
    Большинство "магических файловых систем" у компонентов было перенесено в дискеты. То есть, теперь, чтобы иметь либу lib/internet.lua, например, придётся любую из уже имеющихся стандартных дискет OC (дискету OpenOS, например) в сетке крафта объединять с ключом OC (Scrench), пока не получится нужная дискета, а потом скопировать файлы с дискеты на устройство. Но есть и положительная сторона изменения: те диски стандартные, которые можно было найти только в данжах, теперь могут быть спокойно получены через тот же самый ключ. Теперь игрок не будет в AFK для сервера, если он что-то пишет в мониторах, например. Команда /oc_dn будет теперь выводить дебаг-инфу и в чат выполнившего эту команду. Та самая команда saveConfiguration, которую я внезапно обнаружил некоторое время назад, теперь таки добавлена в мануал.
    [*]Пофикшено
    Контейнеры с жидкостью могли пропадать в апгрейде-генераторе (например, cells из ИК2 с лавой). Роботы могли всасывать вёдра жидкости не из источника её в мире, а из прилегающих "текущих" блоков. Всякие внутренние функции были тоже пофикшены. Потенциальный фикс какого-то бага с серверной стойкой. gpu.setResolution возвращала false, даже если разрешение было изменено успешно. При разборке планшета теперь будет, как и положено, возвращаться с нормальным шансом контейнер апгрейдов.
    [*]OpenOS
    Добавлены devfs. Те самые магические штуки внутри /dev. /dev/null, /dev/zero. Перенаправление I/O. Это не так страшно: myprogram > stdout.log 2> stderr.log. Но объяснять, что это, не буду — кто знает, тот поймёт. Более тысячи (ТЫСЯЧИ) юнит-тестов для OpenOS. Множество мелких фиксов.



    Напомню, что разработка OC 1.6 уже заняла более 1 года и ещё 2-3 месяцев. Список изменений на релизе обещает быть огромнейшим.
     
    Скачать новую версию можно, как обычно, на билд-сервере:
    1.7.10: http://ci.cil.li/view/OpenComputers/job/OpenComputers-1.6-MC1.7.10/lastSuccessfulBuild/artifact/build/libs/OpenComputers-MC1.7.10-1.6.0.4-beta.2-universal.jar 1.8.9: http://ci.cil.li/view/OpenComputers/job/OpenComputers-1.6-MC1.8.9/lastSuccessfulBuild/artifact/build/libs/OpenComputers-MC1.8.9-1.6.0.5-beta.2.jar 1.9.4: http://ci.cil.li/view/OpenComputers/job/OpenComputers-1.6-MC1.9.4/lastSuccessfulBuild/artifact/build/libs/OpenComputers-MC1.9.4-1.6.0.1-beta.2.jar

    Или же на GitHub, если угодно.
  2. Fingercomp
    Приветствую Вас, уважаемый читатель! На протяжении уже нескольких недель я думал, о чём мне писать в блоге... И, наконец, нашёл.
    Я начинаю переводить чэйнджлоги ОС. Полезно и нетрудно.
    5 апреля 2015 года резилнулась версия OC 1.5.6, в которой кое-что изменили. Посмотрим на список изменений!
    Добавлено: Хамелиум теперь можно поедать. Но лучше не надо. Больше, БОЛЬШЕ АЕ2 интеграции! Автор выражает благодарность DrummerMC.
    [*]Изменено:
    Дискеты и харддрайвы теперь стираются через перекрафт самого себя, Шифт-клик отключён. Улучшенное обращение с рецептами. Теперь можно поставить false и отключить рецепт вообще. Миссинги будут генерировать ошибки уровня "Внимание".
    [*]Пофикшено:
    WAILA теперь показывает инфу о 3D-принте корректно. Конвертер для Форести применяется не только для пчёлокоттеждей/изунализаторов/..., но и для пчёл в инвентарях. Комментарий переводчика: Мне непонятно, что это за конвертер появился.


    [*]Дисассемблер игнорировал размер выхода рецептов... В общем, из 1 наггета получался 1 слиток. Дюпобаг. [*]Потенциальные краши в интеграции с АЕ2 даже в новых версиях... Будем надеяться, что сработает. [*]Улучшена интеграция ForgeMultipart и 3D-принтов. Ими теперь можно прикрывать кабели из Project:R3D, например. [*]Редстоун контроллер теперь по-нормальному включает компьютер. [*]Бесконечныепроводные сообщения вызывали загрузку чанков.


    Вот и всё в этой версии. В принципе, ничего дополнительно объяснять не нужно, потому я здесь заканичваю. Комментарии, как всегда, приветствуются =)
  3. Fingercomp
    BETTER THAN MINECON 2015


    В выходные (4 и 5 июля) проходило мероприятие Better Than Minecon 2015, где обсуждался модифицированный Майнкрафт. Из моддеров присутствовали:
    asie — BuildCraft BlayTheNinth — EiraMoticons, Cooking for Blockheads copygirl — Flamingo, BetterStorage Cricket — Chisel CyanideX — InfernalSkies Darkhax — WAWLA Drullkus — Thermal Smeltery Dynious, BlayTheNinth — Refined Relocation Jared — FluxedCrystals 2 ljfa — Glass Shards magik9k — PlankOS для OC marcin212 — Zetta Industries masa — Ender Utilities pixlepix — Aura Cascade Sangar — OpenComputers shadowfacts — Matter Overdrive Skyem123, Achati, Vec — Integrated Circuits tterrag — EnderIO 2.2.3 Vexatos — Computronics, BuildCraft Oil Tweak

    Подробнее о том, что там происходило, здесь: http://asie.pl/btm15.html. Там же ссылки на записи некоторых из событий на BTS15.
     
    В частности, живая презентация OpenComputers, о которой я и хотел рассказать:
     

     
    P. S. Кто-нибудь был там с нашего форума?)
  4. Fingercomp
    Мегапроекты, мегаобсуждения, огромная мотивация... Ну, конец истории вы уже поняли.
    В этом посте посетим могилу Ethel — моей игры, которой было суждено не быть.
    Начать надо с понятий. Ethel — это платформер. Естественно, 2D и скроллинговый.

    На скрине выше:
    Красные — это враги. При контакте с ними персонаж дохнет. Жёлтый прямоугольник — это персонаж. Голубенький квадратик — это точка спаун поинта. Серенький — это каменья. По ним можно ходить. А остальное — небо.
    Затея сделать игру приняла форму действия 30 мая 2017 года и (моими усилиями) стремительно нарастала фичами.
    Из реализованных фич:
    Самые тупейшие враги. Они идут в одну сторону — и в другую при коллизии о стену или своего товарища. Передвижение базовое. Можно прыгать и ходить. Дебаг-экран, отключаемый по F1. Загрузка всех ресурсов из файлов. Карта выше была загружена из файла с данными карты. И спрайты, и тайлы. Физика какая-то. Примитивная, конечно. Как-то коллизии умудряется определять и ускорение рассчитывать. Главное меню. Куда ж без него? 20 FPS на опенкомпе. Вроде бы. Хотя это, скорее, из-за того, что нереализованного дофига. 2D и скроллинг. Для адекватности в скорости использовалась либа doubleBuffering. Все компоненты соединяются посредством либы событий libaevent, которую я тогда достаточно любил, потому что довольно удобная штука она есть.
    Но тут параллельно мы поднимали свой сервачок MC, для которого, очевидно, нужен был свой сайт. Сисайт. Иначе несолидно. А так как 2 любительских проекта параллельно одновременно я вести не умею, выжить должен был один из них за счёт второго. И так получилось, что вторым стал ethel.
    Уже через 3 недели после начала энтузиазм куда-то иссяк — и 27 июня был запушен коммит, который оказался последним. С тех пор обновлений не было.
    Какую мораль я вытащил из этого потонувшего проекта?
    Я не умею делать нормальные архитектуры. Но это я и так знал. То же для физики. Казалось бы, что там сложного-то: радиус-вектор, вектор скорости и вектор ускорения. Но вот я и в них как-то запутался. Там самым запарным было из этих трёх векторов сообразить нормальный интерфейс программный. Во-первых, действующих на спрайты сил было несколько. Как минимум, там есть гравитация. В теории могли бы быть всякие пружинки. Во-вторых, движение врагов, на самом деле, задаваться должно не ускорением, а простой скоростью. Я там как-то накостылял, и оно даже работало, но удовольствия от этого я не получил. И коллизии. Просто так на них прочекать тоже не столь и сложно, но запары все возникали при использовании результата проверки в методах, задающих поведение спрайтов. Костыли — это плохо. Ну, то есть, всё как обычно.
    Посмотреть на останки можно здесь. Можно даже попробовать запустить это — но сначала сделайте git checkout HEAD^^ (в мастере там какие-то блохи). А, ещё надо будет откуда-то достать либу буферную. И lua-objects скопировать в /usr/lib/lua-objects/lua_objects.lua.
    Ethel — это лишь один из множества руин некогда поражавших воображение своей амбициозностью проектов. В этом элитном клубе мы намереваемся продолжить копаться в исторической пыли и вытаскивать на свет из-под неё и другие павшие проекты.
    Поэтому ненастойчиво убеждаем вас подписаться на сей чудесный блог, тыкнув на соответствующую кнопку — ту, что повыше. А можно нажать и на обе. 🍪
  5. Fingercomp
    Решил больше не ждать с этим. Где-то пару месяцев назад решил начать пилить одну штуку — кукбук, или книгу "рецептов". Изначально задумывалось как сборник просто именно рецептов как в кулинарной книге: тонна кода и немного объяснений; получилось наоборот, естественно, — до того, что в некоторых "рецептах" кода нет, — ну это, наверное, потому что я не умею толком через код объяснять.
     
    В любом случае, теперь это сборник полезных туториалов по практическому применению.
     
    Он разделён на 3 раздела.
    Lua — статьи, непосредственно затрагивающие код и написание программ. Сниппеты кода, гайды по функциям. OpenOS — статьи абстракции уровня выше немного. Здесь всё об использовании шелла, стандартных программ и прочих фичах дефолтной оси OC. OC — статьи, не относящиеся непосредственно к разработке программ или фичам OpenOS. Наверное, это in-world штуки всякие, по большей части. Например, инфа о том, как собрать идеальный хрякокоптер или правильно тестировать нанытов. Потом могут быть статьи о всяких блоках, да и прочих фичах самого мода.

    Когда я сейчас пишу эту запись, в кукбуке есть уже 13 рецептов.
     
    Ссылочка на книжку. Заходите, почитайте.
     
    Есть слухи, что на гитбуксе можно отсылать пулл реквесты... Они здесь называются чендж-реквестами, но разницы никакой. Если есть идея для ещё одного рецепта и желание написать статью — присывайте эти реквесты; если желания нет — можно написать идею в комментариях. Я пока не особо понимаю, чего ещё бы добавить в кукбук.
  6. Fingercomp
    Minecraft Mods



    #2



    Обзор обновления MoarPeripherals 1.5



    #2. Turtle Teleport.


    Вторая часть обзора обновления этого замечательнейшего аддона 1.5 у Вас перед глазами! Сегодня мы поговорим о незамысловатой штуковине, а именно о Turtle Teleport, или, в русском переводе, черепашьему телепорту. Строение делаю похожим на пред. часть.
     
    I. Что это такое и с чем его едят?
    Ну, не знаю, как Вы будете грызть этот блок, но нужен он для телепортации туртлей, что следует из весьма интересного названия. Всё
     
    II. API.
    Телепорт имеет всего 3 функции:
    requiredFuel(x, y, z) :: numberЭтот блок не такой читерный, как кажется. Он кушает топливо! Но маленько, не страшно Эта ф-ия показывается, сколько ед. топлива потребуется для телепортации.
    [*]getTurtleLocation() :: boolean, table OR boolean, string
    Возвращает в случае успеха вторым аргументом таблицу, содержащую координаты. Пример: { 0, 64, 0}

    [*]teleportTo(x, y, z) :: boolean OR boolean, string
    Собственно, телепортирует черепаху.



    III. Launch!
    Пора выпить чашечку кода и заняться самым весёлым.
    1. Исходная позиция. Обращаю внимание, что черепаха должна находиться над телепортом.

    2. Я написал простенькую прогу, которая демонстрирует возможности этого блока. Начнём с подключения блока и получения ф-ий.

    3. Как работает ф-ия getTurtleLocation(). Комментариев не требуется?

    4. Допустим, мы хотим запустить туртлю на 10 блоков в плюс по всем координатам. Расчитываем необходимое кол-во топлива.

    5. Попробуем запустить. Упс! Черепаха разряжена, о чём нам сообщают.

    6. Запускаем, наконец, черепаху! true

    7. И снимок того, куда телепортнулась туртля.

     
    IV. Заключение.
    Надеюсь, Вам эта информация была интересна. Оставляйте комментарии, оценки, "Лайки". И, конечно же, ждите новых записей у меня в блоге =)
  7. Fingercomp
    И лучше поздно, чем никогда. Недели две-три назад вышла версия OC 1.6-RC1 (Release Candidate). В основном ничего особенного, только баг-фиксы.
     
    Изменения:
    Фиксы LuaJ с помощью мастера по починке LuaJ. gamax92, если быть точнее. Plan9k теперь будет хотя бы запускаться. Ну замечательный прогресс уже, хотя крашиться всё так же любит. Switch и Access Point были скрыты в NEI. Поддержка энергии RotaryCraft. Обновление мануала под 1.6. Облегчённые рецепты. Из алмазов делаются алмазные кусочки, которые нельзя потом собрать воедино. Опция для отключения эффектов частиц у нанытов. Работа с жидкостными реакторами IC2 через редстоун-порт. Кабели можно красить в инвентаре, они выпадают крашенными. Краска теперь тратится. Обновлён китайский перевод. Обновлён русский перевод. Фикс ачивки про свитч. Свитча-то нет. Команда /oc_sc спаунит компьютеры лицом к игроку. Баг-фиксы в OpenOS. Фикс краша при подключении нескольких серверных компонентов к одной стороне, когда при этом к ней не подключён сервер. install теперь не будет копировать ещё и файлы по символическим ссылкам. Юнит-тесты.

    В целом OC выглядит уже достаточно стабильным для игры. Новую версию можно скачать только здесь. На GitHub её нет.
  8. Fingercomp
    В звуковой карточке есть дохрена функционала - поэтому она и крутая. В этой части попытаюсь объяснить достаточно сложные штуки, которые используют большие дяди.
    Надеюсь, что вы прочитали и поняли две предыдущие части цикла - это будет довольно важно для последующего повествования.
    [Раньше тут был полноценный пост с эмбедом, но после переезда оно всё, соответственно, сломалось. Текст доступен здесь.]
  9. Fingercomp
    Небольшое обновленьице OC вышло сегодня, в котором есть немного небольших изменений.

    1.5.16 Добавлено: Транспозер — управляемая компьютером мультисторонняя воронка. Позволяет перетаскивать жидкости и предметы между соседними блоками. Интеграция с читёрнейшим AgriCraft. LordJoda Интеграция с интересным модиком Better Records. Функция для программного изменения архитектуры процессора. Ребут при изменении. Аргумент, который не ресетит монитор при биндинге GPU. makkarpov
    [*]Изменено:
    Access Point + Switch = реле, блок, совмещающий функции составляющих. Изначально — свитч, беспроводная карта превращает в точку доступа. В режиме свитча может быть вставлена линкокарта. Обновление Plan9k
    [*]Пофикшено:
    Редкая проблема с интеграцией. Много другой мелкотни.




    1.5.17 Пофикшено: Краш при изменении архитектуры АПУ (самый лёгкий способ краша за всю историю ОС). Дронотапки теперь поглощают повреждения за счёт энергии.

  10. Fingercomp
    Началось всё с пустого файла.
    Набросав костылей, ловисипедов и более-менее нормального кода... Рад представить вам свой ламповый репозиторий на ГитХабике с набором программок, написанных на Python. На текущий момент все они в какой-то мере взаимодействуют с Minecraft.
    По-порядку.
     

    Чат-клиент
    Так как блог так или иначе обязан подчиняться правилам, я упоминаю только один чат-клиент под именем "cc-chat". Кое-как подёргав API форума, смог сделать небольшую программу, которая сейчас умеет работать с чатом (отправлять и получать сообщения из/в чат (-а) нашего форума).

    Интерфейс простой. Внизу строка ввода, справа немного кнопок, лист онлайна и сам чат. К слову, клик по нику с контролом — вставить в строку его, а клик с альтом — открыть профиль в браузере.
    Но это так, плюшки.
    Если тыкнуть по большой кнопке [ⓘ], окно с тонной всякой информации.


    Здесь и ТОПы, и места в них, и баланс, и голоса. Особая благодарность @cyber01 за API.
     
    Установка
    Для начала установите Python 3, BeautifulSoup, PyGObject. Скачайте программу с Гитхаба и запустите её. Создастся файл конфигурации, путь к нему будет указан в диалоге.
    Теперь перейдите на страницу чата, откройте DevTools.
    Открыв вкладку "Network", нажмите на кнопку [Обновить] в чате. Появится запрос в списке. Откройте URL запроса в отдельной вкладке и скопируйте всё, что находится между secure_key= и &type. Это есть секретный ключ, который, естественно, никому не нужно давать.
    Откройте файл конфигурации в редакторе и в первую строку вставьте этот ключ.
    Затем в браузере найдите Cookies для сайта, скопируйте их и вставьте во вторую строку браузера.
    Всё это требуется из-за костыльного АПИ форума =\
    Если всё хорошо, при попытке запустить программу, она не завершится с ошибкой.
    К слову, в трее появится значок программы, левый клик по которой скрывает или показывает окно.
     
     
     

    Мониторилка
    Пропустив ту самую программу, идём к mc-monitor. Это небольшое приложение, которое полностью умещается в трее. Позволяет мониторить сервера Minecraft без захода на всякие сайты. Кроме того, имеется таймер, который "звенит" каждые 24 часа. Полезно, чтобы не забыть про голосование.
     
     
    Установка
    Установите, если ещё не сделали, Python 3, PyGObject.
    Просто запустите программу. Скопируйте путь к файлу кнфигурации и откройте его в редакторе.
    Там можно указать список серверов в следующем формате:
    адрес.сервера:порт=Имя сервера
    По строке на каждый сервер.
     
     
     

    Баги, глюки, пуллы, вопросы и сырцы
    Ищите на GitHub: https://github.com/Fingercomp/python-utils/
  11. Fingercomp
    Багофиксы, в основном только они. Вот из того, что добавилось:
    У планшетов можно получать полноценное направление взгляда игрока. Количество максимальных частей пакета добавлено в информацию об устройстве (та, что computer.getDeviceInfo(). [1.10.2] Интеграция с ExtraCells и Mekanism. [1.12.2] Интеграция с ComputerCraft.

    Остальное:
    Изменили рецепт алмазных кусков по умолчанию. Пофиксили область видимости датчика движения. Планшетам разрешили отрубать экран. Дроны адекватно заставили воспринимать чанклодырное улучшение. Item conduits из EnderIO чего-то из микроконтроллеров доставали ненужного. Несовместимость с IC2 Classic устранена. В IRC-клиенте с дискеты пофиксили CTCP. [1.11.2] Какая-то бага с добавлением предметов в улучшение-БД. [1.11.2] И ещё бага с доступом к компонентам вроде дисковода в планшетах.

    Обновления в OpenOS:
    Нет необходимости теперь, в кои-то веки, писать = в начале строк в интерпретаторе Lua. Оно автоматически возвращает. Можно в error пихать таблицы, и крашиться не должно. Наконец-то разрешили монтировать системы файловые в существующие директории. Ещё можно примонтировать директорию в другое место. Если вы напишете одну команду и 10 раз другую, то в истории последняя будет только один раз. Не придётся 10 раз тыкать "вверх", чтобы первую команду получить. Фиксили проблемы с загрузкой OpenOS на медленных хостах. Я думаю, это ошибка TLWY, которая при старте кидалась. .shrc может принимать ввод. Пофиксили поиск названия клавиши по коду в либе keyboard. Фикс event.cancel и event.ignore какой-то. Интерпретатор теперь здраво воспринимает ошибки переполнения памяти в сериализаторе. Какой-то TLWY в /bin/tree.lua. Улучшения в vt100 всякие. Код стал ещё уродливее ради уменьшения потребления памяти. Вот такие улучшения.

    Вот как-то так. Отсюда качабельно.
  12. Fingercomp
    Добавлено Версия дисковода гибких дисков (дискет, если что) для серверов. Возможность взаимодействовать с некоторыми хранилищами предметов с помощью контроллера инвентаря (не особо понял, что тут нового. Видимо, новые инвентари или черех адаптер). Поддержка энергии RotaryCraft. Возможность задать границы вывода (я про viewport, да) на GPU, так что теперь можно химичить с производительностью всякими нестандартными путями. Кабели запоминают цвета, в которых их красили, при срубании. Можно их теперь ещё и в сетке крафта красить. Интеграция с IC2 на 1.8.9. Можно переключаться между всеми лут-дискетами, перекрафчивая их с ключом. computer.getDeviceInfo() — метод, который возвращает базовую инфу об устройствах (от планок памяти до всяких шифраторов CX). computer.getProgramLocations() — функция, которая возвращает, на каких лут-дискетах какие лут-программы лежат. Торговый апгрейд для роботов. Торговля с жителями, об этом я уже писал. Можно задать свои HTTP-хедеры вместе с, ммм, HTTP-запросом. debug.playSoundAt, которая, как ни странно, играет звуки. Возможность задать используемый CPU из AE2 при запросе на автокрафт. Интеграция с ThaumicEnergistics. Цветные дронотапки (hover boots). Индикатор сетевой активности на серверах. Перевод на бразильский язык.
    [*]Изменено
    Мажорнейшее и вообще самое основное — серверные стойки. Я о них писал, да. Удалённые терминалы (Remote Terminals) подключаться должны к серверу удалённых терминалов (Remote Terminal Servers), штучке для серверной стойки. Компонент дисководиков. Можно теперь программно выкидывать диски из дисководов. Нёрф геолайзера — учитывается теперь дистанция до блока, а не колонны. Зато область сканирования можно задавать не только в виде колонны, а в виде кубоидов объёмом до 64 блоков. Упрощены рецепты. Новый шрифт поставлен. Можно сменить ещё с помощью ресурспаков. Один солидный книжный том изменений в OpenOS.
    [*]Починено
    Зависания при крафте, возвращающем тот же предмет, что и данный на входе. Всякие проблемы с рецептами режима грега. Обработка userdata в LuaJ. Конвертация энергии некоторых модов. Проблемы производительности из-за слишком усердной компресси данных, передаваемых клиенту. Тоже проблемы производительности, связанные с отправкой пакетов с дескрипторами компьютеров на клиенты. Обновление LuaJ с фиксами багов. Интеграция с Mystcarft. Напомню, категория "починено". Интеграция с ключом BuildCraft. Роботы могли черпать блоки текучих жидкостей, не источников. Генератор поедал нещадно предметы, если они не были вовремя оттуда вынуты. Контейнеры апгрейдов никогда не выпадали из планшетов при разборке. Сломанный код сохранения информации о блоках OC в версиях MC выше 1.8. Микроконтроллеры ловили только сигналы с сетевой карты.



    Вот это всё и есть OC 1.6. Вот чем он так крут по сравнению с прошлой версией. Ченджлог на страницу!
     
    Со времени первого коммита OC 1.6 до текущего момента прошло 465 дней. Это год и 100 дней. И ведь всё это время я ошибочно думал, что вот-вот, немного подождать, и будет 1.6.0, пару изменений ещё только.
     
    Здесь оригинал списка гигантского и ссылки на скачивание.
    У меня есть несколько записей, посвящённых обновлениям в этой версии. Если ещё их не читали, рекомендую ознакомиться.
  13. Fingercomp
    Интересные изменения:
    Добавили поддержку Lua 5.4.4. Он не сильно отличается от Lua 5.3, но у него есть атрибуты локальных переменных (<const>, <close>). Последний выглядит очень полезным. Архитектура пока экспериментальна, нужно явно включать в конфиге мода. С остальными либами Lua тоже капитальная переделка. Наконец-то пофиксили инты в методах компонентов (если вам вызов когда-либо говорил invalid key to 'next', это оно). Сами либы обновили до последних версий (например, 5.3.6) и пересобрали с оптимизациями. В том числе под 64-битные армы (линукс, мак). Чтобы не путаться, на текстуре блока redstone i/o точками, как у игральной кости, показывается, какая это сторона: . Теперь рисуются юникод-символы выше U+FFFF. Там, например, всякие емоджи запиханы. Лишь бы в шрифте глифы под них имелись. Патчить шрифт можно ресурс-паками. Причём необязательно собирать глифы для всех символов: если в ресурс-паке глиф не указан, то он берётся из шрифта мода. Интернет-карту переписали на другую HTTP-библиотеку, чтобы она умела слать PATCH-запросы. Ссылка: 1.7.10 / 1.12.2.
  14. Fingercomp
    Сейчас я покажу, как сделать это:

     
    На скрине выше — улучшенный debug.debug().
     
    Он умеет:
    Бегать вверх-вниз по стэку вызовов независимо от того, где запущен. Показывать красивые стэктрейсы. Имитировать динамический скоуп: получать значения локальных переменных, редактировать их, не требуя возни с либой debug. При этом учитывает, на каком уровне в стэке вызовов он находится.  
    Он не умеет:
    «Шагать» по коду, заходить внутрь функций, проскакивать над ними.  
    Таким образом, это не совсем дебаггер. Но он может показать состояние всех доступных переменных.
     
    Чтобы заюзать в коде, нужно сделать так:
    require("dbg")()  
    Впрочем, если в проге есть какой-то часто вызываемый сегмент, то безусловно падать в мини-дебаггер на каждой итерации очень печально. Поэтому можно задать условие, при котором его запускать. Например:
    require("dbg")(nonNegative < 0) У нас есть переменная nonNegative, которая семантически всегда неотрицательна. Если ж внезапно попалось что-то меньше нуля, есть смысл попросить программиста проверить, кто (и как) изобрёл свою алгебру.
     
    Команды:
    :bt — показать стэктрейс. :up — прыгнуть на уровень вверх. :down — спуститься на уровень вниз. :frame N — перейти на N-ый уровень.  
    Выйти из интерпретатора можно, нажав Ctrl-D или Ctrl-C.
     
    Код: https://gist.github.com/Fingercomp/58388304f45bf6b2b8108e3b7a555315 (задумывался одноразовым, качество соответствующее).
     
    В обычной Lua надо просто кинуть содержимое куда-нибудь, откуда require тащит файлы.
     
    Чтобы это работало в OpenComputers, придётся пропатчить содержимое мода:
    Открываем jar-файл мода в архиваторе. Идём в /assets/opencomputers/lua. Открываем файл machine.lua и в районе 971 строки делаем как-то так:

      Сохраняемся и выходим.  
    Если всё сделано правильно, в OpenComputers теперь доступна полная либа debug. Остаётся закинуть код мини-дебаггера, например, в /home/lib, дальше используем как обычно.
     
    Очевидно, что на серверах такое делать не надо. Ну, совсем не надо. Полной либой debug легко выудить нативную load. А это уже уязвимость.
    Но в сингле вещь незаменимая. Цитирую отзыв пользователя, пожелавшего остаться анонимным:
     
    Успехов вам в дезинсекции кода.
  15. Fingercomp
    TL;DR: require("process").info().data.signal = function() end.
     
    С версии OpenOS 1.7.3 интеррапты работают так:
    local interrupting = uptime() - lastInterrupt > 1 and keyboard.isControlDown() and keyboard.isKeyDown(keyboard.keys.c) if interrupting then lastInterrupt = uptime() if keyboard.isAltDown() then require("process").info().data.signal("interrupted", 0) return end event.push("interrupted", lastInterrupt) end Это отрывок из /lib/event.lua. Он говорит, что если зажать Ctrl, Alt и C, то вызовется некоторая функция: require("process").info().data.signal.
     
    Программы в OpenOS запускаются в процессах. У каждого процесса есть свой главный поток (о них я писал где-то там), своё окружение. Каждый процесс следит за тем, какие файлы открыты, чтобы их закрыть при завершении процесса, жонглирует событиями и занимается сложной логикой. А ещё у каждого процесса есть свои данные. Эти данные для текущего процесса как раз возвращает process.info().data.
     
    У процессов есть иерархия. Корневой процесс — это тот, в котором запускается /init.lua. В нём устанавливается переменная signal:
    -- /boot/01_process.lua local init_thread = _coroutine.running() process.list[init_thread] = { path = "/init.lua", command = "init", env = _ENV, data = { vars={}, handles={}, io={}, --init will populate this coroutine_handler = _coroutine, signal = error -- ① }, instances = setmetatable({}, {__mode="v"}) }  
    Другие программы запускаются в дочерних процессах. Они наследуют данные родительского процесса. Поэтому process.info().data.signal, обработчик жёсткого интеррапта, по умолчанию возвращает функцию error. Но данные можно переопределить. Как видно из кода /lib/event.lua, нам достаточно, чтобы новый обработчик не вызывал error.
    require("process").info().data.signal = function(msg, level) print("You've pressed Ctrl-Alt-C!") end Это будет работать для всех потоков внутри текущего процесса, а также для других, запущенных в нём.
     
    Стоит отметить, что потоки знают, к какому процессу они прицеплены, и этот процесс можно менять на другой. thread:detach() — просто лёгкий способ сменить процесс, в котором работает поток, на корневой. А там process.info().data.signal — это функция error. Поэтому после Ctrl-Alt-C поток всё равно получит ошибку и, если она не поймана, завершится. А программа продолжит работать. Поэтому, чтобы быть совсем спокойным, можно отключить Ctrl-Alt-C глобально:
    local process = require("process") local p = process.findProcess() while p.parent do p = p.parent end p.data.signal = function() end Хотя я бы, конечно, не советовал так делать. Очень неудобно потом останавливать другие программы: приходится перезагружать компьютер.
  16. Fingercomp
    ; — это код, который делает приблизительно ничего. Не абсолютно: об этом статья.

    Когда я писал crateriform (видяшки в гайде про корутины этим набором прог зарендерены), я отталкивался от Lua-парсера на Lua от @LeshaInc (спасибо ему ещё раз): Lua-часть принимала исходный файл с кодом, парсила его на AST и генерировала по нему обратно код. С костылями.
     
    Для рендера нужен был "сценарий" — файл, в котором указаны, какие символы изменились и на какое значение, помимо прочего. Генерируемые костыли как раз этим занимались: они оборачивались вокруг выражений и писали в файл высчитанное значение.
     

     
    Чтобы показать кадр с "n = 10", как на гифке, и следующий за ним, сценарий такой:
    5,16 5,16 expr 10 Здесь через пробел: позиция начала в исходном коде, позиция конца, опкод (expr) и значение выражения.
     
    Так как генерируемый код делает то же, что и исходный, но ещё рисует сценарий, а выражения могут быть засунуты где угодно и раскрываться сразу в несколько значений, я создаю лямбду (анонимную функцию) и тут же её вызываю. Вот как выглядит часть сгенерированного кода, который занимается строкой выше:
    highlight({5, 16}, {5, 16}, (function(...) local values = table.pack(...) return function() return table.unpack(values, 1, values.n) end end)((n)), 'expr') Выглядит очень сложно (для сложности есть причины), но сейчас интересует только это:
    (function(...) <...> end)(...) Эта конструкция присутствует как третий аргумент к highlight. Программисты на JS с этим шаблоном должны быть знакомы: создаётся лямбда и тут же вызывается с некими аргументами. В месте, где синтаксис позволяет указывать только выражение — в списке аргументов вызова в нашем случае, — таким образом размещаем стейтменты.
     
    На всякий случай скажу, что стейтмент — любая цельная конструкция, кроме выражений. Если вы берёте часть кода, которая отдельно, вырванная из кода, не выдаёт синтаксическую ошибку (например, цикл for или local x = 3), и её нельзя поместить после x =  , это стейтмент.
     
    А теперь суть.
    (function(x) print(x^2) end)(2) (function(y) print(y + 2) end)(2) Этот код задумывался так, чтобы он два раза принтнул четвёрку. Запускаем:
    $ lua5.3 semicolon.lua 4.0 lua5.3: semicolon.lua:1: attempt to call a nil value stack traceback: semicolon.lua:1: in main chunk [C]: in ? ..?
     
    Lua игнорирует пробельные символы. Код вроде такого:
    func(3) (4)(5) ...эквивалентен такому:
    func(3)(4)(5) В примере с ошибкой вызывается первая лямбда, возвращающая nil, который мы затем пытаемся вызвать с аргументом — второй лямбдой. Поэтому получаем "attempt to call a nil value". Чиним с помощью ;:
    (function(x) print(x^2) --> 4.0 end)(2) ; (function(y) print(y + 2) --> 4 end)(2) Кстати, чтобы ещё с толку сбить: комментарий вместо ; ошибку не исправит.
     
    Ещё один ошибочный пример:
    local pi = math.pi (function(r) print(2 * pi * r) end)(3) Как чинить, вы уже знаете.
     
    Отдельно упомяну точку с запятой после return. return обязан быть последним стейтментом в блоке. А ; — это стейтмент. Почему тогда можно делать так?
    local function f(x) return x^2; end print(f(2)) --> 4.0 Ответ: потому что ; — это опциональная часть return, а не отдельный стейтмент. Если же залипает клавиша и получается вот так:
    local function f(x) return x^2;; end print(f(2)) ...то будет синтаксическая ошибка. Вторая точка с запятой — теперь отдельный стейтмент, которых после return быть не должно.
     
    Поэтому с уважением относитесь к этому стейтменту. Точка с запятой делает приблизительно ничего, но с умом.
  17. Fingercomp
    Обновление OpenComputers до третьей беты 1.6. Сегодня в гостях у нас следующие изменения:
    Добавлено В русский мануал добавлена информация про saveConfiguration (PR #1855 от cyber01). Функция computer.getProgramLocations, которая используется для программы install из OpenOS.
    [*]Пофикшено
    Неожиданный баг с сохранением мира в версиях MC выше 1.8.
    [*]OpenOS
    Команда cat теперь будет читать stdin, если не указан файл. cp: поддержка путей вида /. и более мелкие фиксы. df теперь поддерживает относительные пути. Функция next либы /lib/guid.lua теперь возвращает GUID в корректном формате. head теперь закрывает stdin. install был сильно переработан и теперь с помощью этой программы можно устанавливать файлы с loot-дискет (и не только), мануал в man install. less теперь поддерживает скроллинг, в кои-то веки! Ну и алиас в /etc/profile был, конечно, убран. В mv добавлено несколько проверок: команда будет выдавать теперь ошибку, если путь назначения в режиме только для чтения или путь имени для копирования — точка монтирования. У rm была пофикшена проблема, при которой ссылки на директории не могли быть удалены. Шелл поддерживает экранировку пробелов и может отдавать сигнал SIGPIPE. А ещё позволяет использовать getWorkingDirectory до установки переменной окружения PWD.



    На момент писания этого текста в install был уже обнаружен один баг, который даже пофикшен, остаётся ждать принятия PR.
     
    Github
  18. Fingercomp
    ОБНОВЛЕНИЕ OPENCOMPUTERS ДО ВЕРСИИ 1.5.13 PRE 1.


     
    Спустя 20 дней, наконец-то вышла новая версия OC. Изменений немного, но пусть это не смущает Вас...
    ...Ведь в 1.5.13 появляется новая архитектура процессора: Lua 5.3! Подробнее.
     
    В этом пре-релизе появляется, как уже было сказано, новая архитектура: Lua 5.3, что и является причиной для новой версии.
    Если Вы играли с dev-билдами OC 1.5.13, Вам необходимо выставить значение enableLua53 в true. Необходимо такое было, так как новая архитектура была очень нестабильная по сравнению стабильности архитектуры на данный момент.
     
    Как поиграться с этой штуковиной? Возьмите CPU в руки, зажмите [shift] и кликните процессором. В чате появится надпись об изменении архитектуры.
     
    Кроме того, множество мелких изменений прмсутствует в этой версии, чэйнджлог который приедет уже к полному релизу.
     
    --
    Собственно, вот я и перевёл описание релиза с ГитХаба) Кстати, девелоперские версии ОС можно получить с Jenkins: http://ci.cil.li/job/OpenComputers-dev-MC1.7.10/
  19. Fingercomp
    ОБНОВЛЕНИЕ OPENCOMPUTERS ДО ВЕРСИИ 1.5.9 RELEASE CANDIDATE 1!


    Приветствую Вас, уважаемый читатель. Автор OpenComputers Sangar продолжает работать над своим модом, поэтому встречаем новую версию 1.5.9! Точнее, первого кандидата на релиз.
    Взглянем на изменения.
    Добавлено: Charger теперь может использовать для зарядки батарейных апгрейдов! И, кроме них, все другие предметы, хранящие и содержащие энергию RF и EU!
    Интеграция с IngameWikiMod. Большая часть страничек из мануала там доступны.
    То, чего мне иногда не хватало. Стандартный шелл теперь поддерживает пайпинг!cat < f1 | cat >> f2

    Поддержка многожильного кабеля из BluePower.
    Больше, БОЛЬШЕ интеграции с GregTech! В рецептах можно использовать машины из Грега.
    Waypoint. Может использоваться с навигационными апгрейдами.

    [*]Изменено:
    Логика и механика рендеринга апгрейдов на роботе была изменена. Аддонам проще ставить свои апгрейды, а на MC1.8 всё работает, как и должно.

    [*]Пофикшено:
    Дроны теряли своё имя при замене EEPROM.
    Потенциальный клиентский лог-спам при открытия ГУИ Dissaembler'а, если функция disassembleAllThings была включена.
    Роботы продолжать анимироваться даже при паузе.
    MC1.8:
    Несколько потенциальных NPE



    Вот и всё. Комментарии как всегда приветствуются, равно как и лайки и даже оценки!
    А ещё...
    Следим за интересными предложениями, багами на баг-трекере OpenComputers! https://github.com/MightyPirates/OpenComputers/issues
    Проверяем обновления ОС! https://github.com/MightyPirates/OpenComputers/releases
    Заходим на официальный сайт... http://oc.cil.li/ ...и форум! http://oc.cil.li/index.php?/index
    И прямые ссылки для скачивания:
    [MC1.7.10] https://github.com/MightyPirates/OpenComputers/releases/download/v1.5.9-rc.1/OpenComputers-MC1.7.10-1.5.9.20-rc.1-universal.jar
    [MC1.8] https://github.com/MightyPirates/OpenComputers/releases/download/v1.5.9-rc.1/OpenComputers-MC1.8-1.5.9.22-rc.1-universal.jar
  20. Fingercomp
    Продолжаем беседу об операционной системе Bolge OpenOS. В этой записи речь пойдёт про те самые оставшиеся утилиты, которые облегчат жизнь программисту.


    Сложность: средне 60%
    Скучность: высокая 80%
    Дубовость: для продвинутых 65%

    Операционная система OpenOS в первую очередь покрывает вопросы (относительно) удобного программирования для OpenComputers. Конечно, это не исключает сторонние редакторы типа Sublime Text или Notepad++, но иметь такие средства нужно и важно. Давайте же я расскажу о них. 


    УТИЛИТЫ ДЛЯ ПРОГРАММИРОВАНИЯ.
    Простой перечень утилит с пояснениями.  
    address
    Наипростейшая из наипростейших утилит, может соперничать даже с print("Hello, world!"). Просто выводит адрес компьютера. Интереса ради, пропишите view /bin/address.lua.
     
    components
    Ещё раз я расскажу об этой программке. Она выводит список компонентов, подключённых к системе. Можно задать фильтр, тогда выведутся только указанные компоненты. Если же указать ключ -l (о них в следующей части), то для каждого компонента будут указываться методы.
     
    dmesg
    Данная программа случает все события и выводит информацию о них на экран. Можно указать фильтры событий для просулшивания через пробел.
     
    flash
    Та самая программа, которая записывает код на EEPROM. Ключ -l выводит код о текущего EEPROM, -r записывает код в файл, а -q заставляет не задавать вопросов.
     
    hostname
    Данная программа бессмысленна без пакета network. Но, тем не менее, она может устанавливать и выводить текущее имя компьютера.
     
    lua
    Если запустить без аргумента или с ключом -i, то запустится интерактивный сеанс Lua-интерпретатора, где можно запускать программы. При этом все библиотеки автоматически переносятся в _G, так что дополнительно подключать их не требуется. Если же указать файл, то скрипт предпримет попытку запуститься и выдаст сообщение при обнаружении ошибки.
     
    primary
    Синтаксис: primary <компонент> [адрес]. Если аргумент [адрес] опущен, то выводится информация о первичном компоненте, иначе — предпринимается попытка сделать данное устройство первичным.
     
    rc
    Программа управления сервисами (о них — в следующих частях). Синтаксис: rc <сервис> [команда] [аргументы].
     
    redstone
    Предоставляет простой интерфейс управления редстоун-сигналами на первичной ред-карте/ред-блоке. По умолчанию синтаксис следующий: redstone <сторона> [значение]. Если [значение] не задано, выводится информация о текущем. Иначе — устанавливается.
    Для многожильных кабелей синтаксис следующий: redstone -b <сторона> <цвет> [значение]. Работа необязательного аргумента такая же.
    Для блоков, предоставляющих интерфейс беспроводной передачи ред-сигнала, команды следующие:
    redstone -w [сила]. Если [сила] задана, устанавливается значение на беспроводном передатчике. Иначе — выводится текущее значение силы. redstone -f [частота]. Устанавливает частоту, если задан аргумент, иначе — выводит текущую.

    sh
    Запускает сеанс командной строки, если не передано аргументов и io.stdin не перенаправлен. Иначе — читает команды из этого потока и выполняет их.
     
    umount
    Синтаксис: umount <точка монтирования>. Отмонтирует устройство по данной точке монтирования.

    Вот так. Следующая часть целиком и полностью посвящена шеллу, ему родимому. Это: переменные окружения, алиасы, ключи, аргументы, особенности работы шелла и прочее. Пока жду комментариев по этой части, пишите, если что-то непонятно.  



    ← →

  21. Fingercomp
    tl;dr: https://gist.github.com/Fingercomp/0773bb0714296c0cb00d70a696d39bb3
     
    Понятия не имею, зачем я сюда об этом пишу, ведь если вы можете этот текст понять, и в оригинале можно прочитать.
     
    В любом случае, получил намёк, что три моих статейки про звуковую карту удовлетворительны в какой-то степени, но они на русском. Видите ли, ситуация с документацией спустя полгода после первого поста не улучшилась никак, так что единственный туториал для неё недоступен для понимания тех, кто не говорит по-русски.
     
    Поэтому я потратил выходные на перевод постов на английский язык. Заняло это отчего-то дольше, чем я ожидал. Результат на гисте.
     
    Все три поста в одном месте. Я там подбросил ещё чутка инфы и терминов и подправил фактические неточности. Мне лень было несколько раз перечитывать один и тот же текст, так что где-то могут остаться очепятки и всякие извороты языковые не к месту.
    Но если понимаете английский, то всё равно должно быть удобнее, чем бегать по трём статьям здесь, в блоге. Ну а мне редактировать проще.
     
    В общем, ссылку я оставил, больше мне сказать нечего.
  22. Fingercomp
    Последняя, пятая часть мастеровления полностью посвящена шеллу и его программам. Переменные окружения, алиасы и с ними связанные команды — я не врал.

    Сложность: высокая 75%
    Скучность: высокая 75%
    Дубовость: для продвинутых 80%

    Ключевой частью OpenOS является шелл. Это программа, которая выполняет команды, рисует командную строку, в общем, занимается предоставлением удобства пользователю. 


    ШЕЛЛ OPENOS.
    Сразу предупреждаю, что мы не будем рассматривать в данном гайде именно API шелла, только как программу. Из места — в карьер и...  
    Переменные окружения
    Это такие переменные, доступ к которым есть у всех приложений. По умолчанию создаются:
    "EDITOR" = "/bin/edit". Редактор по умолчанию. "HISTSIZE" = "10". Размер истории. "HOME" = "/home". Домашняя папка. "IFS" = " ". Символ для разделения. "MANPATH" = "/usr/man:.". Пути к папкам с файлами справочной системы. "PAGER" = "/bin/more". Программа типа more, осуществляющая функцию постраничного вывода. "PATH" = "/bin:/usr/bin:/home/bin:.". Основная переменная системы, указывает папки, где искать программы. "PS1" = "$PWD# ". Собственно, выражение, которое указывается в интерактивном режиме шелле перед полем команд. "PWD" = "/". Текущая рабочая директория, меняется, например, при вызове cd. "SHELL" = "/bin/sh". Шелл по умолчанию. "TMPDIR" = "/tmp". Временная директория.

    Таким образом, если изменить эти параметры и запустить использующие эти переменные программы, то можно изменять их поведение по собственным нуждам.
     
    set и unset
    Используются для этого две программы: set и unset. У первой следующий синтаксис: set [<название>[=<значение>]]. Если не указать никаких аргументов, просто перечислятся все переменные окружения. Если указать только название, то под определённым порядковым номером запишется название, если же ему присвоить значение, то возникнет пара <название>=<значение>. Главное — не ошибитесь при изменении важных переменных типа PATH.
    Чтобы снять значение переменной, пропишите unset <название переменной> [название второй переменной] [...].
     
    Алиасы
    Что такое алиасы? Это создание команды, которая будет вызывать другую. В общем, можно считать это ещё одним типом ссылки. Из стандартных алиасов имеются:
    dir = ls list = ls move = mv rename = mv copy = cp del = rm md = mkdir cls = clear less = more rs = redstone view = edit -r help = man ? = man cp = cp -i

    В данном перечне при написании команды слева выполняется команда справа. Это может быть удобно, например, чтобы не писать длинное "redstone", а только "rs".
     
    alias и unalias
    Но не это главное. Вы сами можете устанавливать алиасы!
    Первая команда alias имеет следующий синтаксис: alias [<Ваш вариант> [исполняемая команда]]. Если не указать аргументов в принципе, покажутся все алиасы, если указать только название — значение алиаса. Устанавливается только при указании значения.
    Чтобы снять алиас, достаточно команды unalias. unalias <название>.
     
    user*
    Приватность данных всё больше и больше волнует смертных человекоподобных существ пользователей ПК. OpenOS не остался исключением, и итог тому — предоставляемым самим модом функции управления пользователями. Тут всё просто. Есть в списке — гуляй, нет в списке — сорри, аксесс денайд.
    На основании уже сказанного мной текста, логично предположить, что детальное описание и использование лежит в глубине документации по API OpenComputers, и Вы будете правы. Единственная причина, почему я пишу об этом — для операций управления списком предназначены две простейшие утилиты useradd и userdel.
    Синтаксис useradd: useradd <игрок>. Ограничение состоит в том, что игрок этот должен быть в онлайне. И ограничение это накладывает сам мод, не система. К сожалению.
    Соответственно, логично, что userdel <игрок> удаляет игрока из списка пользователей.
    Если список пуст, то компьютер доступен всем. Если Вы сначала добавили друга, а затем захотели прописать себя — увы и ах. Так что прописывайте себя первым пользователем, если ещё собираетесь пользоваться компьютером. В любом случае, если Вы совершили олошность, то могут спасти ситуацию администратор или этот счастливый игрок.
     
    * и ?
    Обратили внимание на заголовок предыдущей записи? Тогда поговорим о масках. Нет, совсем не карнавальных.
    Представим следующую стркутуру:
    /|+ clones| || + clone001| + clone002| + clone003| + clone004| + clone101| + clone110| + colne001| + colne101| + colne|+ clonesEX|+ docsEX|+ docs | + doc_future-bak + doc*nature+smth + docFcreature_smth + doc2progsmth + doc.no + totallyNOTa.doc
    Задача попроще. Предположим, мы хотим перетащить в папку clonesEX все файлы из папки clones, при этом копировать папку нельзя. Что делать? Здесь нам на помощь придут эти самые маски. Конкретнее — *. Звёздочка в пути заменяет нуль и более символов. Соответственно, команда: mv clones/* clonesEX.
    Отмотаем время назад и допустим, что нужно перетащить только файлы с colne. Подумав, составляем команду: cp clones/colne* cloneEX. К слову, эта команда также захватит с собою colne. А что, если нам нужны именно файлы с номерами?.. Звёздочка тут не поможет, поэтому воспользуемся знаком вопроса (?). Он заменяет ровно один символ. В нашем случае достаточно такого: cp clones/colne??? clonesEX. Или даже такого: cp clones/colne?* clonesEX.
    По этому принципу перетащим все файлы, начинающиееся с doc, заканчивающиеся smth и имеющего название, отделённого двумя символами от doc и smth, из docs в docsEX. Подумайте, какую команду можно использовать.
    Ответ:

     
     
    ТАБ!
    Завершим рассказ о шелле потрясающей кавишей [TAB]. Суть её проста и огромна — если Вы ввели часть пути, то нажатие ТАБа дополнит до первого совпадения. Ещё одно нажатие — следующее совпадение и т. д.
     


    ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ СТАНДАРТНЫХ ПРОГРАММ?
    Удивительно, но мы, наконец-то, рассмотрели все стандартные утилиты и принципы работы (пишите в commentsStart, если это не так). Потому я закрываю цикл "OpenOS. От дуба до Мастера". В будущем будут другие записи, которые, вероятно, рассмотрят вопрос OpenOS в плане предоставляемых АПИ и скрытых открытых возможностей.
    Благодарю за прочтение.




  23. Fingercomp
    Вышла новая версия OpenComputers, в основном с самыми разными фиксами. Что изменилось:
    Моды теперь могут добавлять свои кастомные дискеты, которые можно получить перекрафтом их с ключом. (Vexatos) Две функции дебаг-карты: для отправки сообщения на другую дебаг-карту и отправки текста в буфер обмена какого-либо игрока. Опасная штука. (Vexatos) Когда роботы/дроны выкидывают что-либо в мир, они теперь посылают ивент. (Sangar) Добавлен новый предмет — MFU. Позволяет подключить к адаптеру любой блок, находящийся на удалении нескольких блоков. Это позволяет небольшие билды сделать красивее, а сложные схемы — удобнее. (Vexatos) Обновлён перевод на немецкий. (Vexatos) Обновлены LuaJ и JNLua — заявляется, что теперь всё лучше с UTF-8. (gamax92, Sangar) Обновление OpenOS. Как обычно, много изменений, но здесь опять уменьшение потребление памяти и увеличение производительности. (payonel) Дискета oppm теперь использует современные способы установки в OpenOS. А ещё программу обновили. (Vexatos) Обновление Plan9k. (magik6k) В планшетах не работал слот для карт, если было вставлено улучшение. (Vexatos) Очень труднонаходимый баг с экранами, которые после перезагрузки чанка (причём особенного) зависали, был ликвидирован. (Sangar) Больше не получится много раз потыкать ключом по дрону, чтобы получить большее их количество. (Vexatos) Устранены проблемы с вайлой (очень странная логика у неё) (Sangar) [MC 1.8.9+] При выкидывании предметов роботами или дронами некоторые уничтожались. (Vexatos) [MC 1.8.9+] Краш при использовании функции getName на нанонашинах. (Vexatos) [MC 1.9.4+] Компоненты могли не деинициализироваться, когда чанк с ними выгружался. Это приводило, например, к смене UUID компонентов. (Sangar) [MC 1.9.4+] Починили рендер клавиатуры. (Vexatos) [MC 1.9.4+] Команды ломали /help. (Vexatos) [MC 1.9.4+] В наномашинах не было эффектов зелий. (Vexatos) [MC 1.10.2+] Улучшена интеграция с JEI. (Vexatos)

    Релиз на GitHub.
  24. Fingercomp
    Раз уж я тут пишу понемногу свой крутой пакетный манагёр, расскажу о пакетных менеджерах немного.
     
    Пакетный менеджер — штука сложная. Потому что, хотя задача у него, в общем-то, одна — менеджировать пакеты — сюда включается и установка, и удаление, и обновление, и, вообще, много всякого. Но а так как пока сам не напишешь, ПМ не поймёшь, здесь расскажу об установке пакетов и зависимостей с кодом.
     
    Ещё немного предисловий, о зависимостях. Это ключевая фича ПМ: вы-то прогу скопировать/разархировать и сами можете, вот только если программа зависит от другой, а та — от двух других, и т. д., вам это надоест. Людям надоело. Создали пакетные менеджеры. Теперь программы пакуются в пакеты — а рядом со скомпилированными бинарниками лежит ещё кусок информации: имя пакета, версии, зависимости, авторы, изменения и много-много всяких других полей. При установке данные считываются и далее уже делается, что сказано. Зависимости ли ставятся, ещё ли что-нибудь.
     
    А затем пакетов становится много, появляются репозитории полноценные, ну и так далее.
     
    Итак, давайте сделаем программу для установки пакетов. Ну, почти. Именно полезной нагрузки как таковой не будет, будем использовать такую структуру информации о пакете (назовём это манифестом пакета):
    { "name": "имя пакета", "files": [ { "url": "http://example.com/bin-1", "path": "/usr/bin/program1" } , { "url": "http://example.com/library-1.so", "path": "/usr/lib/library1.so" } ]}
    Пока без зависимостей, всё просто.
     

    Вот такой код получим:
    def install(name): # получаем манифест пакета с данным именем manifest = getManifest(name) # проходимся по файлам... for file in manifest["files"]: # ...скачиваем и ставим их в нужные места download(url=file["url"], path=file["path"])
    Ничего примечательного, на самом деле. Получаем манифест, скачиваем файлы и пишем "тадаам".
     

    Давайте сделаем вот такие манифесты:
    { "name": "pkg1" # имя пакета, "deps": # зависимости [ { "name": "pkg1-1" } , { "name": "pkg1-2" } ], "files": [ { "url": "http://example.com/pkg1/file", "path": "/opt/pkg1/file" } ]} { "name": "pkg1-1", "deps": [ { "name": "pkg1-1-1" } ], "files": [ { "url": "http://example.com/pkg1-1/file1", "path": "/opt/pkg1-1/file1" } , { "url": "http://example.com/pkg1-1/file2", "path": "/opt/pkg1-1/file2" } ]} { "name": "pkg1-1-1", "deps": [], "files": [ { "url": "http://example.com/pkg1-1-1/file", "path": "/opt/pkg1-1-1/file" } ] { "name": "pkg1-2", "deps": [], "files": [ { "url": "http://example.com/pkg1-2/file1", "path": "/opt/pkg1-2/file1" } , { "url": "http://example.com/pkg1-2/file2", "path": "/opt/pkg1-2/file2" } ]}
    У нас есть 4 пакета: pkg1, pkg1-1, pkg1-1-1, pkg1-2. Вот граф зависимостей:
     
     
     
     
     
     
     
     
     



     

    Очевидно, что просто так теперь тут в рандомном порядке пакеты поставить нельзя. Так как при установке пакета, например, pkg1-1, он совершенно справедливо считает, что его зависимость, pkg1-1-1, уже установлена.
     
    То есть, по-хорошему, нам надо сначала брать пакеты без неразрешённых зависимостей, и подниматься вверх. Однако, есть идея покруче.
     
    Я сейчас наваяю рекурсивную функцию resolveDeps, которая будет, как ни странно, разрешать зависимости:
    def resolveDeps(name): result = [] # результатирующая последовательность установки пакетов manifest = getManifest(name) for dep in manifest["deps"]: # В Python справедливен код типа `[1, 2, 3] + [4, 5, 6] == [1, 2, 3, 4, 5, 6]`, т.е. склеиваение списков. result = resolveDeps(dep["name"]) + result return result
    Если мы дадим ей манифесты, она выдаст вот такой список: ["pkg1-1-1", "pkg1-1", "pkg1-2", "pkg1"] — от менее сложного к более сложному. То, что нужно. Затем мы ставим просто их:
    for pkg in resolveDeps("pkg1"): install(pkg)
    Давайте улучшим алгоритм. Сделаем проверку на установленность: нам ведь не надо повторно скачивать файлы, которые уже есть.
    def resolveDeps(name): result = [] # Проверяем, установлен ли пакет if not isInstalled(name): manifest = getManifest(name) for dep in manifest["deps"]: result = resolveDeps(dep["name"]) + result return result
    Если у нас уже поставлен pkg1-1, то получим всего лишь ["pkg1-2", "pkg1"]. Круто!
     

    Возьмём другой граф:
     
     
     




    Как видно, от pkg1-1-1 зависят сразу 2 пакета: pkg1-1 и pkg1-2. Проблема в том, что на выходе у нас будет ["pkg1-1-1", "pkg1-1-1", "pkg1-1", "pkg1-2", "pkg1"] — ни разу не то, что мы хотели. Давайте это исправим:
    def resolveDeps(name, resolved=None): resolved = resolved or [] # список уже разрешённых пакетов if name in resolved: # Пакет уже был разрешён, ничего больше не требуется return resolved if not isInstalled(name): manifest = getManifest(name) for dep in manifest["deps"]: resolveDeps(dep["name"], resolved) # Теперь список один на всю рекурсию resolved.append(name) # Без рекурсии сюда попасть можно, если пакет не имеет неустановленных зависимостей return resolved
    Теперь выхлоп у нас ["pkg1-1-1", "pkg1-1", "pkg1-2", "pkg1"] — как и предписывали.
     

    А вот вам ещё граф:
     
     
     




     

    Какая тут засада? А у нас дерево циркулярное — не руки циркуляркой отрезает, а в бесконечную рекурсию вводит. Вот как можно этого избежать:
    def resolveDeps(name, resolved=None, unresolved=None): resolved = resolved or [] unresolved = unresolved or [] # список ещё не разрешённых пакетов if name in unresolved: # Мы попали сюда через рекурсию. Когда-то пакет уже был добавлен в список unresolved, # после чего функция ушла в рекурсивное разрешение зависимостей этого пакета. # Какой-то из зависимостей в итоге опять имеет данный пакет как зависимость. # Это ошибка, такого быть не должно, паникуем. raise ValueError("circular dependencies detected") if name in resolved: # Пакет уже был разрешён, ничего больше не требуется return resolved unresolved.append(name) if not isInstalled(name): manifest = getManifest(name) for dep in manifest["deps"]: resolveDeps(dep["name"], resolved, unresolved) # даём unresolved resolved.append(name) # Не забываем убирать из списка del unresolved[unresoved.index(name)] return resolved
    Теперь у нас в данном графе будет сгенерировано исключение, а потому рекурсии бесконечной не произойдёт.
     

    Итак, у нас есть простая функция, которая составляет список пакетов для последовательной установки без ломаний. Это уже круто, но время шло, и появилось такое явление как версии. Впрочем, об этом поговорим в другой раз. Там есть свои заморочки, с которыми нужно разобраться.
     
    Вот похожая статья, но на английском. Рекомендую ознакомиться.
     
    Лицензия: CreativeCommons Attribution-NonCommercial 4.0 International License

×
×
  • Создать...