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

Fingercomp

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

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

  • Посещение

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

    283

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

  1. Fingercomp
    С недавним (1.5.18) релизом OpenComputers появилась такая хрень — наноботы. Посмотрев ролик от автора мода (он будет внизу статьи), было ясно, что запутался или я, или автор. Скорее всего первое. Потому решил отложить их на потом.
     
    И вот, пришло то время. По-быстрому забежав на тестовый сервачок и поигравшись с ними, понял, насколько чудовищно... КРУТЫ эти мелкие штуки. Почему? А сейчас узнаем.
     


    I. Тварелогия.
    Вообще, я немного наврал со словом "сейчас". Обосновывать будем по ходу развития сюжета, а в конце (нет, в середине!) сделаем вывод.
    Итак, вот вам выдержка из статьи по нанороботиксам.
    Нанороботы, наноботы, наномашины, наноиды, наниты, наномиты и иже с ими (будем использовать несколько обозначений в этом гайде) — это такие мелкие штуки, которые попадают в организм кубического человека и жрать, мозги, хлам! помогают ему обрести новые способности.  


    II. Приборы и девайсы.
    Значит так, в процессе эксперемента нам нужно: желание умереть, мозги, больше мозгов, невероятное желание подохнуть, планшет, наноботы, грог (?!).  


    III. Ход эксперимента. Физ. часть.
    Итак, вы подготовили всё, что нужно. Давайте приступать.
    Я не указал, но возьмите ведро молока. Если, конечно, вы хотите избавиться от...
    В общем, съешьте нанитов. А теперь выпейте молока. После столь болезненной операции (что? Болезненной? Мы ж серьёзные люди — и кубизм явно то показывает. Не смешите) просто встаньте рядом с активной зарядкой.
    Ну, в общем, вот такая панорама (точней — её кусок) должна получиться.

    Как видно, слева от хотбара расположилась батарейка, которая показывает текущее состояние батареи в наните.
     

    Вообще, можно кушать более одного набора машинок нанометрических, вот только это ничего путного не даст — только сменит конфигурацию.
    К слову, чтобы вывести наномашинок — выпейте грог
     
    Собственно, на этом вся физическая часть закончена. Далее будем управлять через планшет.
     


    IV. Ход эксперемента. Информационная часть.
    Всё управление происходит через беспроводную сеть, так что планшет нужен с беспроводной сетевой картой.
    "Протокол" общения с наномитами предельно прост. Используется функция modem.broadcast(). При этом наниты слушают эфир на всех частотах по умолчанию. Первым куском данных ВСЕГДА является строка "nanomachines". Команда уже такая: modem.broadcast(1337, "nanomachines"). Затем идёт сама функция и аргументами, так же отделёнными частями пакета. Итого: modem.broadcast(1337, "nanomachines", "команда", "первый аргумент, строковой", 2, "прошлый аргумент — числовой", "и т. д."). Не переживайте, я ещё вернусь к этому в перечне команд.  

    Итак, начнём наш перечень с не очень нужных игроку, но полезных команд.
    setResponsePort(port:Number):String,Number. ОБЯЗАТЕЛЬНАЯ КОМАНДА ПЕРЕД НАЧАЛОМ РАБОТЫ! Именно. Так как вещать на всех частотах — идея обломная, лучше поставить заданный порт. Обломная настолько, что без указания порта-канала не будут возвращаться данные! Вот так всё жестоко. Поэтому пропишите modem.broadcast(PORT, "nanomachines", "setResponsePort", PORT). Например: broadcast(1337, "nanomachines", "setResponsePort", 1337). Прописали? Можно продолжать.
    К слову, возвращает "port", port, собственно, где port и есть указанное значение. Бесполезная фишка, кажется. getHealth():String,Number,Number. Значит, возвращает количество здоровья (текущее и максимальное). Чтобы не отвлекаться в дальнейшем, скажу сразу, что взвращаются данные так же через модем, через тот самый указанный порт. Так что не забудьте открыть его (modem.open(PORT)) и указать получение данных через event.pull("modem_message"). Формат данных: "modem_message", "адрес сетевухи на текущем компе", "адрес наноботов", порт, расстояние, "nanomachines", возвращаемые данные.... В данной функции возвращаемые данные: "health", 15, 20, где 15 — текущее, а 20 — максимальное состояния здоровья. getPowerState():String,Number,Number. Возвращает состояние энергии в наномитах: "power", 5000, 10000, где 5000 — текущее, а 10000 — максимальное количества энергии. getHunger():String,Number,Number. Возвращает состояние шкалы голода: "hunger", 10, 20, где 10 — текущее, а 20 — максимальное показания шкалы. getAge():String,Number. Возвращает "возраст" — общее время пребывания игрока на сервере в секундах с момента первого захода на сервер: "age", 1896, где 1896 — этот самый "возраст". getName():String,String. Возвращает имя игрока, который переносит наноботов: "name", "Fingercomp", где "Fingercomp" — имя игрока.

    Вооооооот, теперь самое интересное.
     


    V. Ход эксперимента. Часть, в которой 18 кнопок.
    Тык-с, теперь основное предназначение нанитов — давать всякие эффекты! Начиная от простых частиц вокруг игрока, заканчивая смертью.
    Есть 18 переключателей (входов в терминологии ОС), каждый даёт свой эффект. Набор переключатель-эффект называется конфигурацией. При каждом поедании нанобота эта конфигурация обновляется рандомными значениями. Если в первый раз 9 вход убивал, то теперь он, например, хилит. И т. д.
    ^ Выдрано из комментариев и заменено предыдущей непонятной фигнёй.
    Эффектами, кстати, могут быть не только всякие regeneration, но и просто спаун частиц, а также раритетные эффекты вроде магнита, притягивающего предметы. getSafeActiveInputs():String,Number. Возвращает лимит безопасных активных входов: "safeActiveInputs", 2, где 2 — это установленное в конфиге значение. getMaxActiveInputs():String,Number. Возвращает второй лимит на количество входов всего: "maxActiveInputs", 4, где 4 — тот самый лимит. setInput(input:Number, active:Boolean). Активирует и деактивирует вход. Тут всё просто — первый аргумент является числом от 1 до 18, а второй — состояние активности (true — включить, false — выключить). getInput(inpt:Number):String,Number/String,Boolean. Возвращает состояние выбранного входа. Если неверно указать — ошибка ("input", "error"). Иначе — состояние. "input", 13, true, где 13 — номер входа, а true — состояние =) getActiveEffects():String,String. Возвращает активные эффекты. Формат: "effects", "{digSpeed}", к примеру.

     


    VI. Финал. Трагедия и выводы.
    Собственно, поигравшись так с нанитами, активировал 9 вход. Вот такой казус возник:

    Угадайте, что произошло, когда я отключил креативку?)

     
     

    Чего и вам желаю.
     
    Выводы:
    Наноботы — не плод фантазии больного ума, но полезная вещь. Наноботы — штука хорошая, но только в разумных пределах. В неразумных от них можно сдохнуть.

    Напоследок продемонстрирую обещанное видео от автора мода про нанитов =) И включите аннотации, там инфа полезная.

     
     
    Удачи :P
  2. Fingercomp
    Дамы и господа! Мы представляем Вам новый Девайс: Вэйпоинт!..
    Собственно, вот.


    МАНУАЛ по вэйпоинту.



    Станьте Мастером по юзанью этой штуки за 5 шагов!



    I. Что это?
    Вэйпоинт — путевая точка — служит для указания роботу или дрону на конкретную локацию. Используется в совокупности с навигационным апгрейдом. Робот может получать относительные координаты места, силу подведённого к вэйпоинту редстоун-сигнала и название вэйпоинта.
    Внимание! Вэйпоинт указывает на блок, где спаунятся фиолетовые частицы!!  
     
     
     
     
     
     

    II. Использование.
    Для сканирования местности и получения данных о вэйпоинтах, необходим навигационный апгрейд в роботе или в дроне. Тогда появляется новая функция: findWaypoints(range) :: table
    Возвращаемая таблица будет содержать следующие значения:
    { { label="Имя вэйпоинта", position={ 0, --| Относительные |- X 0, --| координаты |- Y 0, --| вэйпоинта. |- Z n=3 -- Значение данного параметра неизвестно. }, redstone=0 -- Сила редстоуна, подведённая к вэйпоинт-блоку. }, { label="Имя второго вэйпоинта", position={ 0, 0, 0, n=3 }, redstone=15 } ...}

    III. Подробности.
    Имя вэйпоинта устанавливается через GUI этого блока.
     

    Но есть и второй вариант: вэйпоинт регистрирует себя как компонент:

     
    Так что мы можем обратиться к его фукнкциям:
    getLabel() :: string -- возвращает текущее название вэйпоинтаsetLabel(label:string) -- устанавливает новое название вэйпоинта

     
     
     
     
     
     
     

    IV. Практика!

    Специально для теста я по-быстрому написал 2 простенькие программы: поиск вэйпоинтов и перемещение к данному вэйпоинту.
    Полигон для тестов выглядел так:
     

    С ред-сигналом был только вэйпоинт "Сундук с грязью", как подсказывает первая программа find:

     
    Теперь давайте использовать путевые точки по назначению! Куда более сырая вторая программа goto позволяет перемещаться на данный вэйпоинт. Так как дрон — слишком просто, будем использовать робота "Curiosity".

     
    После выполнения робот перемещается с грязевого сундука на высокий вэйпоинт:
     
    Из-за сырости программы возникают небольшие ошибочки

    Здесь робот хотел пройти сквозь компьютер и попасть к правому вэйпоинту на скрине, но у него это не получилось :|
     
    И последнее. Если робот не находит какой-то вэйпоинт (в данном случае — "набор слов"), он выдаёт ошибочку.

     
     
     
     
     


    V. Заключение. Вэйпоинты могут помочь роботу или дрону легче ориентироваться на местности. Ссылки на скачивание программ: find: wget http://www.pastebin.com/raw.php?i=s0KdZApY find.lua goto: wget http://www.pastebin.com/raw.php?i=nAqrJ9jT goto.lua
    [*]Жду комментариев, лайков и, может, даже оценок! Ведь теперь Вы можете с уверенностью использовать этот замечательный блок [*]И, внимание! Официальное видео от автора ОС, демонстрирующее интересное использование данного блока в повседневных целях.



  3. Fingercomp
    Выключен
    Хост XMPP-сервера был отключён, ищу другой по возможности для настройки.
     
    Итак, хост, на котором был XMPP-сервер, окончательно ушёл куда-то, а вернуться так и не пообещал. Так что пока сервер, который популярностью и не пользовался, будет отключён до нахождения другого бесплатного хоста (буду рад помощи). Планирую запилить на него IRC, плюс ещё парочку других серверов при необходимости. Тем не менее, зарегистрировалось там 8 человек, сообщений написало (вместе с ЛС): 42, а продержался он 3.5 месяца.
     
    Старая запись:

     
  4. 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/
  5. 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. Кто-нибудь был там с нашего форума?)
  6. Fingercomp
    Тут полгода назад я описывал изменения в OpenOS 1.6 и среди прочего я упомянул какие-то окна в либе term. Пришло время описать всю либу term.
     
    Прежде всего, рассмотрим понятие окна. Окно — это таблица типа такой:
     

    {x = 1, y = 1, fullscreen = true, dx = 0, dy = 0, w = 0, h = 0, blink = true} По порядку.
    x, y — это позиция курсора. Ну тут всё предельно ясно. fullscreen — тоже достаточно очевидно. Находится ли окно в фулл-скрине или нет. dx, dy — это смещение окна отновительно левого верхнего края видеокарты. w, h — это всё ширина и высота окна. blink — опция, с помощью которой можно отрубить (и потом вернуть) мерцание курсора.
    Ещё одно понятие, которое нужно обязательно ввести, — это viewport (далее обзывать буду это как вьюпорт). Переводится как "окно просмотра", применительно к нашему контексту это слово означает пространство, в котором можно рисовать всякие символы.
     

    Вот есть монитор из OC. Какой у него вьюпорт? Вроде как очевидно, прямоугольник от левого верхнего символа с шириной и высотой, равный разрешению. Говоря проще, это то, что вы видите в интерфейсе монитора, когда по нему кликнете.
     
    Это было так до версии 1.6. В новой версии появилась функция setViewport, которая позволяет уменьшить видимую часть экрана, оставляя разрешение прежним.
    То есть, если вы на мониторе 3 уровня пропишете gpu.setViewport(80, 25), то всё, что было в пределах прямоугольника шириной в 80 и высотой в 25 символов, останется видимым. Остальное пропадёт. А для вас это будет выглядеть, будто просто сменили разрешение.
    Но при этом вы можете продолжать использовать оставшуюся, невидимую часть экрана. Сетить символы, рисовать квадраты. Как прежде. Только вот юзеры это не увидят.
    А потом можно будет скопировать область из невидимой части в видимую, чтобы показать готовую картинку.
     
    Вернёмся к либе term. Вот то самое "окно", о котором я говорил чуть ранее, — это же и есть самый что ни на есть вьюпорт. Поэтому, когда в либе будут функции с умонинанием window или viewport, нужно понимать, что речь там идёт именно про окно, описанное нами ранее.
     
    Итак, это всё была теория. Теперь будем, наконец, изучать функции либы term.
     
    Первая функция, которую изучим, — это term.internal.open([dx: number[, dy: number[, w: number[, h: number]]]]). Принимает 4, как видно, аргумента, которыми можно задать параметры окна. По умолчанию равны 0.
    Возвращает простую таблицу с установленными параметрами. Её я указывал выше. Ничего особенного.
     
    Этому окну следует присвоить gpu с прокси видеокарты для данного окна и keyboard с адресом клавиатуры для данного окна, опять же.
    Можно просто вызвать term.keyboard(window) — тогда автоматически выберется главный компонент.
    А ещё нужно к выбранной видеокарте прицепить нужный монитор.
     
    Как-то так:
     

    local com = require("component")local term = require("term")local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")local window = term.internal.open()window.gpu = gpugpu.bind(screenAddr)term.keyboard(window) Есть функция term.setViewport([w: number[, h: number[, dx: number[, dy: number[, x: number[, y: number[, window: table]]]]]]]). Если последним аргументом передать наше окно инициализированное, то значения для остальных аргументов подберутся автоматически, используя параметры видеокарты окна. Этой командой мы завершаем подготовку окна для работы.
     

    Но есть вариант попроще. term.bind([gpu: table[, window: table]]) — привязывает видеокарту к окну и вызывает функцию выше для установки стандартных значений. Очень удобно.
     
    Вот итоговый код:
     

    local com = require("component")local term = require("term")local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")local window = term.internal.open()gpu.bind(screenAddr)term.bind(gpu, window)term.keyboard(window) Давайте теперь использовать это окно во всю мощь. Чтобы потом не отвлекаться, сначала перечислю список скучных функций.
    term.gpu([window: table]) — возвращает прокси видеокарты для данного окна. term.isAvailable([window: table]) — говорит, готово ли окно к работе. term.keyboard([window: table]) — возвращает адрес клавиатуры для данного окна. term.screen([window: table]) — возвращает адрес монитора для данного окна. term.getGlobalArea([window: table]) — возвращает значения dx + 1, dy + 1, w и h для данного окна. term.getViewport([window: table]) — возвращает значения w, h, dx, dy, x, y для данного окна.
    А теперь настало время кое-чего поинтереснее. Например, term.drawText(text: string[, wrap: boolean[, window: table]]). Рисует текст, как io.write, но, во-первых, позволяет задать вторым аргументом true, а тогда текст будет переноситься на новую строку, если он длиннее ширины окна; во-вторых, можно задать окно для рисования — и писать текст, например, на другом мониторе, имея в распоряжении при этом обработку \t, \n.
     
    А ещё есть term.scroll(n: number[, window: table]). Он копирует область внутри окна и вставляет её — ниже на n строк, если n > 0, или выше на -n строк, если n < 0. Остальное очищается.
     
    Можно очистить строку, на которой находится в данный момент курсор, с помощью term.clearLine([window: table]). К слову, в прошлой версии первым аргументом был номер строки, которую нужно очистить. Теперь этого нет.
     
    Как видно, во всех функциях аргумент window опционален. Если его не указывать, возьмётся стандартное окно, которое используется системой. Ничего особенного.
     
    Собственно, это всё по окнам. В функциях, которые я перечислю ниже, нет возможности, к сожалению, указать окно аргументом — будет использоваться стандартное. Вот эти функции:
    term.read([options: table]) — функция, с помощью которой можно получить значение от пользователя. Создаёт строку ввода, её обрабатывает и возвращает результат. Можно передать таблицу с опциями: dobreak — если равен false, то после нажатия Enter курсор не переместится на новую строку. hintHandler — функция (принимает текущее значение поля ввода и номер подсказки, переключаемый Tab/Shift-Tab, и возвращает строку с подсказкой) или таблица с подсказками, которые будут предлагаться юзеру по нажатию Tab (или Shift-Tab для возврата назад). pwchar ­— символ, который будет показываться вместо введённых пользователем. Этим можно воспользоваться, чтобы, например, писать пароль. filter — функция, которая принимает значение поля ввода и возвращает true при валидном вводе и false при невалидном, или строка с паттерном Lua, с помощью которых будет проверяться валидность введённых данных. Например, можно разрешить вводить только цифры. Если попытаться ввести невалидные данные, то комьютер радостно пропищит. nowrap — если не задан или равен false, то при достижении конца строки, последующие символы переходят на следующую строку. Иначе будет вести себя, как в версиях до 1.6 — скроллить горизонтально. И, наконец, под числовыми индексами ([1], [2], [3], ...) история ввода — строки, между которыми можно переключаться с помощью стрелочек вверх и вниз.
    [*]term.clear() — вообще 0 идей, с чего вдруг здесь нельзя задавать окно, но тем не менее. Очищает экран. [*]term.pull() — ожидает ивентов, рисуя мерцающий курсор. [*]term.write(value: string[, wrap: boolean]) — то же, что и io.write. [*]term.getCursor() — возвращает позицию курсора. [*]term.setCursor(x: number, y: number) — устанавливает позицию курсора. [*]term.setCursorBlink(enabled: boolean) — включает/выключает мерцание курсора. [*]term.getCursorBlink() — проверяет, включено ли мерцание курсора.

    И вот здесь я предлагаю закончить, наконец, этот туториал. Я описал все функции публичного API этой интересной либы, которая пополнилась очень забавными и прикольными фичами. Теперь думайте сами, что будете делать со всем этим добром :P
  7. Fingercomp
    Здрассьте!
    Я тут прогуливался по StackExchange, и нашёл интересную штуку: Code Golf. В общем-то, это программистский конкурс, который цель ставит эффективно расходовать ресурсы... только жёсткго диска. Надо любыми судьбами на любом языке сделать программу с наименьшим числом даже не символов, а байт!
    Мне показалось это очень интересным занятием. Посмотрев на вопросы, которые по той ссылке доступны, у меня и идейка пришла тоже.
     
    Я всё расписал по идейке здесь: https://znc.hanvix.ru:1308/vori_zolota.htm — и правила, и задание, и полезные ресурсы вообще. Тут вкратце объясню.
     
    Слушали про BMP, что как BitMaP расшифровывается? Так вот это есть формат картиночек такой от Microsoft. Не то, что бы я как-то безудержно фанател от этой корпорации, просто формат картиночек простой, как бревно липовое. Никаких заморочек с компрессиями и прочей интересной очень дрянью! Немного метаданных — и набор пикселей, как он есть!
    Парсить там нечего совершенно, в общем.
    И, значит, берём такую картиночку. Задача: за минимальное число байт исходников написать работающую программу, которая будет рисовать различные символы в зависимости от цвета и прозрачности. Это не сложно, это просто.
     
    Итак, за неделю жду программочки, будем мерить байтики :P Я настоятельно рекомендую поучаствовать, хотя бы почитать в Wikipedia про формат: это достаточно интересная тема. Тем более, что язык программирования абсолютно любой, выбирайте любимый и дерзайте!
     
    Выбирать победителей будем по размеру программы и по количеству лайков. В комментариях опишите работу программы, как её использовать, какой язык, что для неё нужно, приложите саму программу. И можно будет надеяться на призы: от медальки на форуме до игрушки в Steam.
     
    Ещё раз советую заглянуть на https://znc.hanvix.ru:1308/vori_zolota.htm — там всё подробнейшим образом расписано, чтобы облегчить написание в разы. Если и там непонятно что-то — задавайте вопросы в нашей всеми любимой IRC Будем, как обычно, рады ответить и помочь.
     
    Удачи!
  8. Fingercomp
    Здрассьте. Давно уже назревал план сменить к чертям оформление форума, ибо текущее положение дел вызывает тошноту. Да и ночью глаза болят потом.
    И вот, наконец, недавно я загорелся энтузиазмом, и было принято неотвратимое решение напилировать свою тему для форума. Так как станадртные средства форума по изменению мне неизвестны, а курить доки по этому было катастрофически лень, всё сделано в виде стиля к Stylish.
     
    Что меняется?
    Цвет всех элементов, расположение некоторых блоков-индикаторов, округление, картинки, кнопки и много чего другого.
     
    Как установить?
    Перейдите на эту страницу ( https://userstyles.org/styles/120122/dark-dark-robot) и перейдите по ссылке в заголовке. Вам предложат установить расширение для браузера "Stylish". Согласитесь на установку и дождитесь окончания. Затем снова перейдите на эту страницу и тыкните по большой зелёной кнопке "Install with Stylish". Во всплывающем окне нажмите "OK"... Всё! Теперь вы можете наслаждаться тёмным дизайном форума,
    Чтобы отключить тему, нажмите по значку Stylish в панели инструментов и снимите галку с темы "Dark-Dark Robot". Таким же образом её можно будет включить. Управление темой осуществляется на странице управления темами. Щёлкните по значку и выберите "Manage Styles...".
     
    А что нас ожидает?
    Скриншоты этого добра:

     
     

    Внимание!
    Начиная с версии 1.4, DDR требует наличия скрипта для GreaseMonkey под названием "Good Bad People".
    Ссылка: https://greasyfork.org/en/scripts/13471-good-bad-people
    Для работы требуется расширение браузера GreasyMonkey (Firefox) или TamperMonkey (Chrome)!
  9. 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 — это лишь один из множества руин некогда поражавших воображение своей амбициозностью проектов. В этом элитном клубе мы намереваемся продолжить копаться в исторической пыли и вытаскивать на свет из-под неё и другие павшие проекты.
    Поэтому ненастойчиво убеждаем вас подписаться на сей чудесный блог, тыкнув на соответствующую кнопку — ту, что повыше. А можно нажать и на обе. 🍪
  10. Fingercomp
    Что-то особо нового в последнее время не виднеется, а программы не пишутся. На первый взгляд.
    Но, как известно, перед революцией обычно образуется что-то вроде застоя. Предлагаю окунуться в это болото и глянуть, что интересного происходит с OpenComputers и аддонами.
     
    OpenComputers
    Сэнгар немного прихворал, так что коммитов в последнее время немного. Идёт работа над портом 1.6 под версии MC1.8, делают OpenOS 1.6 (псст, эта игрушка обешает быть очень крутой; больше POSIX и пр.). Низкая активность на баг-трекере, в основном, всякие фич-реквесты.
    В скором будущем расскажу, что именно изменилось в 1.6.
    А пока что здесь можно загрузить на поиграться последнюю версию OC. GitHub.
     
    Computronics
    MOAR FEATURES
    Кхм. Ну, значит, бип-карту на прокачку взяли.
    1 tier: простая beep card; 2 tier: возможность указать одну из четырёх волн (синусоидную, квадратную, треугольную или пилообразную); 3 tier: в разработке, в финальном виде должна позволить создавать собственную волну. В общем, ADSR. Вот это обещает быть бомбочкой.

    GitHub. Dev-версии.
     

    OpenSecurity
    Починены турельки, очередь кейпадов. Добавлены небольшие (7 символов) экранчики на них и возможность менять символы на кнопочках.
    GitHub.
     
    Форумы
    Очень интересная программа: ServerFS. Вкратце: сетевые диски. Подробнее: имеем серв, подключаем к нему RAID и ставим tunnel/modem. На другом же компе свободно подключаемся к серверу. В /srv будут примонтированы все эти диски.
  11. Fingercomp
    Minecraft Mods



    #1



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



    #1. Computer Controlled Crafter.


    Приветствую Вас в первой части обзора обновлений аддона к CC MoarPeripherals версии 1.5. Мы рассмотрим один из новых блоков, именуемый Computer Controlled Crafter, или, в моём русском переводе, крафтер. :P
     
    I. Что это и с чем его едят?
    Крафтер — это блок, позволяющий крафтить с компьютера! В принципе, всё =)
    II. API.
    Крафтер имеет несколько функций:
    getInventorySize() :: numberВозвращает кол-во слотов для крафта (их девять )
    [*]craft() :: boolean
    Собственно, тот самый рычаг, и если за него дёрнуть, то начнётся крафт! Если всё пройдёт успешно, положит рядом с ингредиентами и завизжит отрадости: true! Если же нет... то где-то Вы ошиблись =)
    [*]getStackInSlot(slot) :: table
    Некоторый аналог Item Dictionary. Позволяет узнавать доскональную инфу о блоке/предмете. Возвращает таблицу, к которой, я обещаю, мы скоро вернёмся.
    [*]isRecipeValid() :: boolean
    Суть ясна из названия функции. Возвращает true, если можно скрафтить загадочную хрень, и false, если рецепт не существует.
    [*]getCraftingSlot(slot) :: table
    То же, что и getStackInSlot(), но для предметов в сетке крафта.
    [*]setCraftingSlot(slot, item) :: boolean
    Аккуратно укладывает на верстак... скорее, дисплей, так как взаимодействовать напрямую нельзя, предмет в нужный слот (к этому мы скоро вернёмся).
    [*]clearCraftingSlot(slot)
    Недвусмысленная функция. Очищает слот в сетке крафта.
    [*]clearCraftingGrid()
    Менее аккуратный собратец предыдущей функции. Очищает всё скопом.



    Итак, порцию страшилок Вы получили... Теперь перейдём к самому весёлому: к кодингу!
    III. Крафтим!
    Начнём с ГУИ.

    В мой инвентарь Вам заглядывать смысла нет, так что показываю только верхнюю часть. Верхняя часть делится ещё на 3 части! Нет, не пугайтесь преждевременно. Первая часть — сетка крафта, вторая — клетка результата, а третья часть — это инвентарь. Инвентарь можно пополнять или забирать из него с помощью труб, роботов, компьютеров. Но не об этом речь. Предположим, мне позарез нужны Raw Circuit Board. Крафтятся они из блока глины, кактуса пережаренного и золотого зубчика. Кладём в инвентарь ингредиенты.

    Я написал маленькую программу test, в которой показывается код и он же выполняется. Разбираем!
    Во-первых, подключаем перефиральное устройство.
    Затем получаем инфу об айтемах. Для того, чтобы не париться, возьмём готовую ф-ию "getStackInSlot". Что это за цифры? Слоты в инвентаре и в верстаке нуммеруются слева направо, сверзу вниз, то есть так:
    1 2 3
    4 5 6
    7 8 9,
    или, в случае инвентаря:
    1 2 3 4 5 6 7 8 9
    10 11 12 13 14 15 16 17 18.
    В слоте 1 лежит кактус пережаренный. Потому в переменную cactus_green заносится та самая таблица с инфой об айтеме... Её состав рассмотрим попозже =)
    Теперь сеттинг рецепта. Пользуемся ф-ей setCraftingSlot(). В первом аргументе передаём слот, куда хотим положить предмет (не забыли ещё нумерацию?). А во втором — предмет. На самом деле, не обязательно иметь предмет в инвентаре. Можно написать из головы, но об этом — чуть позже.
    Теперь, если мы откроем ГУИ, он будет выглядеть так:

    Но просто так Вы плату сырую не возьмёте, опять нужен комп. Помните, я говорил о волшебном рычажке? А вот и он!

    Последняя строка. Мы крафтим сам предмет! И если мы опять заглянем в столик, то обнаружим такую картину:

    Скрафченный предмет лежит вместе с остальными, так что вытащить его можно только с помощью фильтра.
    IV. Убираем за собой.
    Намусорили, а убирать кто будет? Мы, конечно же =) Пользуемся свякой clearCraftingSlot() и clearCraftingGrid(). Суть понятна из названия. Скриншоты:




    V. Автономный режим activated!
    И напоследок о том, что из себя представляет таблица.

    mod_idID мода.
    [*]raw_name
    Сырое имя. То есть класс предмета/блока.
    [*]max_size
    Максимальный размер стека.
    [*]max_dmg
    Максимальная metadata. Имеет место быть только у ломающихся инструментов.
    [*]dmg
    Значение metadata (то есть числа s: ID:s). В метадате содержатся данные, например, о цвете шерсти или красителя.
    [*]qty
    Количество в данный момент.
    [*]id
    ID айтема по новым стандартам (modID:itemName)
    [*]display_name
    Имя, какое мы видим, наводя на предмет.
    [*]name
    Тип айтема (блок/предмет)



    gold_nugget = {}gold_nugget["id"] = "minecraft:gold_nugget"gold_nugget["dmg"] = 0ccc.setCrafttingSlot(1, gold_nugget)
    Для составления "личного дела" айтема достаточно 2 значений: это id и dmg.После этого система сможет понять, какой именно айтем Вы просите.
    VI. Заключение.
    Теперь Вы знаете, что такое CCC и как им управляться =) Надеюсь на "пятаки", "лайки", комментарии. Ждите новых записей в моём блоге!
  12. 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. Заключение.
    Надеюсь, Вам эта информация была интересна. Оставляйте комментарии, оценки, "Лайки". И, конечно же, ждите новых записей у меня в блоге =)
  13. Fingercomp
    Лого от Totoro
     
    Здрассьте!
    Несколько дней назад я прогуливался по всяким оплотам бюрократии и, не теряя времени, заодно размышлял о том, что форум наш наводит тоску и уныние: программок нет, ничего не обсуждается, дискуссии только разве что о лагах на сервере и сборочках с недосборочками.
    И появилась идея организовать конкурс программистский типа джема.
     
    Джем — это желеобразный пищевой продукт с равномерно распределёнными в нём целыми или измельчёнными плодами (ягодами), сваренными с сахаром с добавлением желирующих веществ... То есть, это такой конкурс, где даётся очень ограниченное время, которое надо умно потратить так, чтобы к кноцу срока предоставить готовый программный продукт. Игрушка под ведроид за два-три дня, как пример.
    Проекты в джемах, очевидно, совершенно недоработанные, борьба там идёт за идею. Но после конкурса никто не запрещает продолжить этот начатый проект.
     
    Так вот. До воскресенья, до 17 июля шеcтнадцатого года, будет по-тихому проходить тоже свой небольшой конкурсик. Он будет не столь серьёзным, чтобы вообще даже называться джемом: времени много, а проект не самый сложный. Есть время подумать, погуглить, поспрашивать на форуме.
     
    Итак, условия этого небольшого конкурсика:
    Дедлайн семнадцатого июля 2016 года (2016.07.17), воскресним вечером. За это время необходимо продумать и реализовать проект, написанный на языке MoonScript. Не пойдёт переписывание уже готовых программ на форуме на этот язык. Платформа абсолютно любая — хоть OpenComputers, хоть ComputerCraft, винда или лялех, Love2D, всякие микроконтроллеры — главное, основную часть должен играть код на MoonScript, оттранспиленный в Lua. Проект по завершении оформить нужно топиком на форуме, указав ссылку на pastebin, gist или github (последние два варианта предпочтительнее) с исходным кодом. На нашем IRC-канале, куда мы не устаём всех звать, мы будем обсуждать и выбирать интересные программы. После дедлайна тех, кто реализует самые интересные (по голосованию) проектики, объявим победителями конкурса.

    Если вообще будет какой-нибудь интерес к этому мероприятию, думаю, организуем награды в виде медальки на форуме, всяких поощрений в виде ююшек или денежек игровых. Может быть, что-нибудь особое вручим, кто знает.
     

    Ключевое условие: участие людей и интерес к конкурсу. Если есть интересные идейки для программы — самое время их реализовать. Заодно подучить новый язык программирования, что явно в пользу пойдёт.
     
    И пока что я довольно скептически настроен, в общем и в целом, так как не особой популярностью пользовались конкретные конкурсы и заказы. Но надо же как-то расшевелить форум.
    Так что дерзайте, и да прибудет удача. Во имя Луны!
     
    P. S. Слева вверху теперь прикручен обратный отчёт до конца джема.
    P. P. S. Добро пожаловать в Треллу! https://trello.com/b/ROncU99z/moonjam — вся та же информация, но в собранном и отклассифицированном виде.
    P. P. P. S. MoonJam завершился!
     
     
     
  14. Fingercomp
    Решил больше не ждать с этим. Где-то пару месяцев назад решил начать пилить одну штуку — кукбук, или книгу "рецептов". Изначально задумывалось как сборник просто именно рецептов как в кулинарной книге: тонна кода и немного объяснений; получилось наоборот, естественно, — до того, что в некоторых "рецептах" кода нет, — ну это, наверное, потому что я не умею толком через код объяснять.
     
    В любом случае, теперь это сборник полезных туториалов по практическому применению.
     
    Он разделён на 3 раздела.
    Lua — статьи, непосредственно затрагивающие код и написание программ. Сниппеты кода, гайды по функциям. OpenOS — статьи абстракции уровня выше немного. Здесь всё об использовании шелла, стандартных программ и прочих фичах дефолтной оси OC. OC — статьи, не относящиеся непосредственно к разработке программ или фичам OpenOS. Наверное, это in-world штуки всякие, по большей части. Например, инфа о том, как собрать идеальный хрякокоптер или правильно тестировать нанытов. Потом могут быть статьи о всяких блоках, да и прочих фичах самого мода.

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

    Ну тут всё интересно. Пугающая штука теперь — интерфейс стойки.


    А на хотбаре у меня лежат орудия пыток.  

    Думаю, предпоследний предмет опознали — это сервер T3. По нажатию ПКМ этим предметом всё так же открывается интерфейс подобный компьютерному, куда можно вставить компоненты. Заменил я его на креативный, так как я играю в креативе, но уровень не так важен.  

    Кладём три предпоследних предмета в стойку. Видим эту страшную картину.


    Но у нас же вроде гайд, поэтому добавим стрелочек.


    (2) — это сервер креативного уровня. В нём стандартный набор компонентов + инет- и беспроводная сетевая карты.
    (1) — это Server Terminal. Об его функции я расскажу позже.
    (3) — специальный дисководик для серверов. Вместо отдельного чукчёмного блока. Функции абсолютно те же.  

    Сразу скажу, что (6) — это та же кнопка, что и [internal/External] в прошлых версиях, а так как её практическое использование нулевое, я промолчу про её функцию.  

    Справа от слотов для серверов и модулей есть 6 линий разноцветных (7). Под каждой линией есть изображение стороны игральной кости (4), символически обозначающее эту линию. Их расшифровка — (5). Получается, для каждой из пяти сторон стойки (передняя не считается) в интерфейсе отдельная линия.  

    Напротив слотов с предметами на линиях образуются точки (9), (10), .... Они требуются для соединения компонентов для серверов . То есть, подключив сервер (2) и компоненты к нижней стороне в интерфейсе, кликнув по большим точкам на линиях, для сервера (2) становятся доступны Server Terminal (1), Rack Disk Drive (3) и компоненты с нижней стороны. Неожиданно просто.  

    А что же за маленькая точечка (8) напротив сервера? Оказывается, она служит для подключения сетевой карты в сервере к какой-либо стороне. Действует так же, как и в прошлых версиях.  

    Теперь про (1), как и обещал. Если раньше всё было очень просто — берём Remote Terminal, подключаем и просто работаем, то теперь всё плохо.
    Эта штука позволяет подключённому к этой же стороне сервер у работать с удалёнными терминалами. Для этого берём Remote Terminal и делаем им ПКМ по компоненту в серверной стойке. Думаю, опознаете. Если загорится лампочка на компоненте в стойке — всё ОК.
    Если же тратить ресурсы на эту штуку не хочется, достаточно просто от указанной стороны компонентов провести кабель к монитору и клавиатуре.  

    "Эм, а как включить сервер?" Теперь всё управление ими ведётся через ПКМ по серверу в стойке. Щёлкаем и можем включить сервер, потушить его и даже сменить компоненты во время работы!  

    Кстати, о дисководах. В него и в дисковод обычный можно вставлять и изымать дискеты через Шифт-ПКМ. Очень удобно.  
     
    Теперь сходим к роботу, так как в OpenComputers появился новый апгрейд: торговый.

    Торговый апгрейд для робота — апгрейд второго уровня, при подключении предоставляет компонент "trading" .
    У него всего одна функция — trading.getTrades() , возвращающая таблицу предложений жителей в радиусе 8 блоков от робота. Каждый элемент представляет собою одну сделку одного из жителей. Структура: {getInput = function():table, table, getOutput = function():table, isEnabled = function():boolean, trade = function():boolean[, string]}

    Функция getInput() возвращает таблицы с описанием необходимых предметов. По сути, это то же описание, что возвращает контроллер инвентаря — метаданные, имеет ли нбт-теги, имя предмета, его айдишник, максимальное повреждение, размер стэка и количество предметов, необходимых для торговли. Если второй предмет не требуется для торговли — вторая таблица будет равняться nil .
     

    Функция getOutput() действует по схожему с предыдущим принципу, только возвращает таблицу с описанием выходного предмета.
     

    Функция isEnabled() возвращает, интересна ли эта сделка на текущий момент жителю. Как известно, после 7 сделок она блокируется. Для разблокирования надо совершить другую сделку с этим же торговцем.
     

    Функция trade() , наконец, совершает сделку. Её условия: в инвентаре робота должно быть достаточное количество предметов для сделки, а предложение должно быть активно. Если всё верно, предметы обмениваются в инвентарь робота.
    Ошибки:
    false, "not enough items to trade" — в инвентаре робота недостаточно предметов для торговли.
    false, "trade is disabled" — житель более не заинтересован в этом предложении (было совершено 7 сделок).
     
    Кроме того, ещё одно мелкое изменение — для дисковода появился собственный компонент "disk_drive". Он есть только у Rack Disk Drive и Disk Drive, но не во встроенных в компьютер.

    Функция isEmpty() возвратит статус дисковода — есть ли в нём диск.  

    Функция eject([velocity]) выплюнет диск из дисковода. Если дать как аргумент число (числа более 1 смысла не имеют, так как эффект тот же), диску передастся определённая скорость.
    Вот пример для максимальной скорости:
     
    Ещё из изменений — интернет-карта.

    Функция request() принимает третьим опциональным аргументом таблицу хедеров. Например, {["Accept-Encoding"] = "application/json"} . Это очень крутое изменение — так, для работы с чатом форума с OpenComputers теперь нет никаких технических преград. А ещё можно наконец-то запилить логин на сайты... Ах, применений много.  
    Для модняков. Если дронотапки совместить с красителями, как кожанку, то неон на них покрасится.


    Для смытия краски достаточно кинуть тапки в ванильный котёл с водой, как кожаную броню.


    Если у меня хватит духу написать вторую часть, то, скорее всего, я начну рассказывать об изменениях в OpenOS 1.6. Ибо материала там тонны.
    Пока что не забудьте проголосовать в опросике сверху. Порадуйте диванных аналитиков.
  16. Fingercomp
    Продолжаем расследовать обновление 1.6 OpenComputers. На очереди новая OpenOS с крутым функционалом и вкусными плюшками.
     
    Так как изменений много, но они разбросаны, призываем маркеры.
    Новая утилита find Прогуливается рекурсивно по файлам, выводя их имена на экран. Можно задать Луа-паттерн аргументом --name для поиска файла нужного. find . --name=".+%.lua"
    [*]Утилита grep
    Тот самый монстр, который ищет паттерн в файлах. Идентичный натуральному, но паттерны Луа. grep -rin "hi" .
    [*]Утилита head
    Если дать файл, выведет первые 10 строчек. Иначе — возьмёт из трубы (pipe): cat mysuperfile | grep "hi" | head. Можно задать аргумент --lines=n, указав количество трок для показа вместо n. head --lines=42 test
    [*]Утилита mktmp
    Создаёт имя во временной директории. По умолчанию — файл, можно указать -d для директории. mktmp -d
    [*]Утилита rmdir
    Честно, не самая нужная программа, т. к. rm -r mydir/. Но тем не менее — удаляет директории. rmdir test/
    [*]Утилита sleep
    Спит указанное время. Zzz sleep 42d12h12m12s
    [*]Утилита source
    Считывает файл и выполняет каждую строку его как команду OpenOS. source /home/.shrc
    [*]Утилита time
    Возвращает время исполнения команды. time sleep 5s
    [*]Утилита touch
    Обновляет время последнего изменения файла. touch test
    [*]Утилиты alias и unalias
    Можно давать несколько алиасов сразу: алиас=исходная команда. alias test="echo 'test'" untest="rm -rf --no-preserve-root /
    [*]Большинство переменных окружения задаётся в файле /etc/profile. [*]На старте программы считывается командой source файл /home/.shrc. Вот мой конфиг:

    alias l="ls -lh"alias ..="cd .."alias df="df -h"alias grep="grep --color"alias vim="edit" # Просто непривычноresolution 80 25

    Библиотеки OpenOS
    guid guid.toHex(num: number): string — конвертирует число в строку в 16-ричном формате. guid.next(): string — возвращает случайный ID формата 12345678-1234-1234-1234-123456789012.
    [*]io
    Заменены входы/выходы (io.stdout, ...) для работы с трубами (pipes). io.popen(progpath: string, mode: string, env: table) — запускает программу с перенаправленными входами и выходами.
    [*]keyboard
    Клавиши задаются теперь в файле /lib/tools/keyboard_full.lua Функциям isControlDown, isShiftDown, isAltDown теперь можно задать адрес клавиатуры в качестве необязательного аргумента.
    [*]term
    term.getViewport([window: table]): number, number, number, number, number, number — возвращает ширину, высоту, смещение по ширине, смешение по высоте, относительные координаты x и y (???). Можно задать окно аргументом. term.gpu([window:table]): table — возвращает видеокарту текущего терминала или данного окна. В принципе, менее муторная алтернатива component.gpu. term.pull([...]): ... — ну прям 99.(9)% равен event.pull. Используется, чтобы курсорчик мигал. term.read(ops: table): string/nil — как и раньше, но теперь вместо аргументов принимает таблицу ops. Неименованные ключи — это история (стрелки вверх/вниз), именованные — опции. Ко всему прочему, новая опция nowrap. Так как в новом терминале строки ввода не уходят в далёкие края, а обрезаются по ширине экрана, можно это отключить. term.read({"test1", "test2", nowrap=true, dobreak=false}). term.readKeyboard(ops: table) — то же, что и выше, но трубы не будут работать. term.drawText(value: string[, wrap: boolean[, window: table]]) — как и term.write, но опять же без труб. term.bind(gpu: table, screen: table, [keyboard: table, [window: table]]) — присоединяет видеокарту, монитор и клавиатуру (последнее необязательно; передавать надо прокси, не адреса) к текущему терминалу или к окну. Терминал не обновит автоматически размеры. term.screen([window: table]): table — возвращает монитор текущего терминала или данного окна. term.keyboard([window: table]): table — то же, но для клавиатуры.




    Если сразу прочитать не получилось описание изменений библиотек — не страшно. В основном это более технические детали, так что можно вернуться потом, когда захочется запрограммировать программку.
    Ну а если что-то слишком непонятно — спрашивайте. Поковыряюсь и объясню.
  17. 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, пару изменений ещё только.
     
    Здесь оригинал списка гигантского и ссылки на скачивание.
    У меня есть несколько записей, посвящённых обновлениям в этой версии. Если ещё их не читали, рекомендую ознакомиться.
  18. Fingercomp
    Новая версия!
    Новое: Можно теперь отключать некоторые стороны адаптера с помощью ключа. Очень нужная фича, если требуется контроль в огромном лагодроме. От Vexatos. robot.compare умеет теперь сравнивать предметы, игнорируя метаданные. Например, сравнивать инструменты можно. Достаточно указать опцию. От Vexatos. Очень хорошая фича заключается в том, что теперь апгрейды табличек не игнорят приват просто, а посылают ивенты! От хорошего человека makkarpov. Можно указать белый список владельцев дебаг-карт. От makkarpov. В кубаче 1.8.9 и выше теперь взаимодействовать можно с инвентарями, имплементирующие интерфейс IItemHandler. Кастомные инвентари, то есть. От Vexatos. В кубаче 1.10 ещё можно менять теперь значения в scoreboard с помощью дебаг-карты. От RusselLong. В кубаче 1.10 вернулась интеграция с EnderIO и добавлена продвинутая поддержка проводочков редстоуновых из того же мода.
    [*]Изменения:
    Очень большое обновление OpenOS! От payonel, как ни странно. Перевод на русский усовершенствован был. От @Totoro.
    [*]Починено:
    Можно теперь всасывать полные текущие блоки жидкости. Функции обратной совместимости bit32.lrotate и bit32.rrotate тоже починены были (они очень некорректно работали при некоторых значениях). Это моё. Опции %c и %e для os.date() теперь возвращают более адекватные значения. От gamax92. Перед удалением дрона проверять, происходит ли это на сервере или на клиенте. От joserobjr. Теперь нельзя удалить файлы из devfs. От payonel. Апгрейд опыта не потребляет зачарованные предметы, если он уже наполнен опытом. Несовместимости со Sponge. От Vexatos. Именование ядер (какой-то фикс для LuaJ). От gamax92. Machine.signal теперь не настолько вредный по поводу типов списков. От Vexatos. NPE, наконец-то, который возникает, если какой-либо другой мод требует тултипы до загрузки рендерера шрифтов. os.time и os.date, как ни странно, зависели от часового пояса сервера. От gamax92. Теперь серверные стойки могут быть запитаны, если к ним подведён кабель, вне зависимости от подключения сервера. Очень прикольный баг был, когда кабель запитывал только компоненты, подключённые к этой стороне. Баг с чтением данных с проводов RedLogic. Патч от Vexatos. Теперь адреса файловых систем, хранящихся в NBT, проверяются. Раньше можно было выйти за пределы папки opencomputers выше по дереву. Очень весёлый баг, да. Фикс от gamax92. В кубаче 1.8.9 и выше только что поставленные сисблоки имели буфер энергии размером в 0 единиц. То есть, не имели совсем. В 1.6.1-hotfix.1: после апгрейда все стороны адаптеров в прежнем мире становились отключенными.



    Ссылки на скачивание.
  19. 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.
  20. Fingercomp
    Окей, новую версию ждать не пришлось год в этот раз. 1.7.0! В наличии много всяких улучшений в OpenOS, баги фиксятся, а не создаются, но каких-либо особых изменений в самом моде нет.
     
    Начнём с новых штучек в моде.
    Версия для 1.11.2 и 1.12.1. Поддержка Forge Energy, интеграция с CC, Project:R3D, WR-CBE, IC2, Hwyla, AE2. Датчик движений можно пихать свободно как апгрейд для роботов. Китайский перевод. Пофикшены фризы монитора у роботов. С 1.12 юзаются ванильные железные наггетсы. Рефакторинг API и кода в целом. Методы getAllStacks и getInventoryName для контроллера инвентаря и транспозера. Наконец-то! Ивент drop посылается и при простом клике (раньше только при таскании). Улучшенная поддержка многожидкостных контейнеров. Вернее, многоконтейнерных блоков. Как-то так. Отсутствующие глифы стали шириною в 1 символ. Бесконечный цикл в мануале. Отличная фича была. Правда, это только со сломанными страницами проявлялось. Роботы не все инструменты адекватно использовали. Теперь все, наверное. Обломали способ загрузить процессор на хостовом компе из игры.

    Ну, мне обманывать смысла не было, да: в осном фиксы всякие. Зато в OpenOS тонны всякого.
    Новая библиотека в OpenOS: thread. Туториал попробую когда-нибудь сообразить. Рефакторинг, чистка и прочие такого рода мероприятия. Фиксы всяких прог и либ (ls, lib/event, lib/keyboard). Вряд ли это интересно. loadfile теперь работает с относительными путями. tty вынесен из lib/term; поддержка кодов vt100. Фиксы окружений в load, bin/lua и шелле. Прога pastebin теперь работает через https. Улучшение производительности всего и вся. Здесь же и либа сериализации. ls использует цвета из переменной окружения LS_COLORS, которая теперь содержит коды vt100. @LeshaInc хотел немного славы, поэтому отдельно упоминаю его — он посоветовал. Лэшань же написал bin/tree, которая включается в стандартную поставку. И, конечно же. Запускается быстрее! Жрёт меньше памяти (140 кБ)! Крутой номер версии!

    Поэтому обновляйтесь. Тем более, что этот релиз имеет наибольшее число поддерживаемых версий. 1.7.10, 1.8.9, 1.9.4, 1.10.2, 1.11.2, 1.12.1. Выбирайте по вкусу на странице релиза.
     
    P. S. Оказывается, я давно не писал сюда что-либо. Тогда тизерну в качестве компенсации. Готовлю потихоньку небольшой кукбук с рецептами по OC, OpenOS и Lua. Думаю скоро выложить. Посмотрим, как оно пойдёт.
  21. Fingercomp
    О прошлой версии я умолчал, но исправляюсь. Вышла 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.
     
    Качать можно отсюда.
  22. Fingercomp
    Новая версия OpenComputers. Неожиданно.
     
    Из наиболее интересного:
    Видеобуферы у графической карточки. Помимо основного, нулевого буфера, который отображается на экране, теперь можно аллоцировать дополнительные буферы — 2D-массивы символов с заданным разрешением, с которыми можно проводить те же операции, что и раньше: set, fill, copy и т. д., — но без потребления бюджета вызовов (то бишь халявно). Добавлена операция bitblt (bit blit), которая копирует кусок одного буфера на другой. Копирование на основной буфер потребляет бюджет вызовов пропорционально разрешению исходного буфера (не размеру области копирования). Может занять несколько тиков. Если верить @ECS, последнее преимущества в производительности практически убивает. Впрочем, за несколько лет, пока буферы висели в дев-билдах, люди уже их заиспользовали для игрушек: вот платформер, например. Прямые вызовы методов компонентов (любых, не только GPU), не имеющих явных лимитов или использования бюджета вызовов, теперь абсолютно бесплатны с этой точки зрения. Раньше они потребляли одну тысячную единицы бюджета вызовов. Подробнее о них — в моей статье. Обновлён шрифт: покрытие значительно расширилось путём забития недостающих символов глифами из Unifont. Заблокирован диапазон 0.0.0.0/8 для интернет-карты. Запросы туда делают примерно то же, что запросы на localhost. Примечательно, что эту уязвимость использовали на CTF для обхода файрволла. Советую почитать. Метод media добавили и для дисководов в серверной стойке. Досадное упущение. Пофиксили отключение компов при перезагрузке чанка: в определённых случаях стейт компьютеров вовсе не сохранялся, из-за чего они рестартились при выгрузке и подгрузке чанка. Починили debug.sendToDebugCard (весьма полезная функция). Разобрались в ориентации редстоун-карт. В 1.7.3 карточки в компах и серверах почему-то использовали абсолютные направления (север/юг/запад/восток) вместо относительных. Беспроводные модемы первого уровня снова могут получать сообщения. А раньше не могли. Это была бага. Ретрансляторы потеряли возможность ретранслировать на неограниченно большие расстояния. В коде мода запутались в min и max. В результатах поиска вейпоинтов навигационным апгрейдом теперь пишутся их адреса.  
    Остальные изменения и ссылка на скачивание — на GitHub.
  23. 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.
  24. Fingercomp
    И снова здраствуйте. Я продолжаю описывать нелёгкий путь от дуба до Мастера в OpenOS.

    Начать предлагаю с вопросов, которые, к счастью, есть.
    Начинает у нас ЛесхаИнц (@@LeshaInc). И его вопрос:
    Бедный человек не разделяет, что принадлежит самой ОС, а что — предоставляемому АПИ компонентов. ОС принадлежит всё то, что написано именно для этой системы. То есть, например, в EEPROM этим кодом просто так Вы воспользоваться не сможете. АПИ компонентов предоставляет сам мод. И независимо от того, стоит ли на компьютере OpenOS, не стоит ли — АПИ мода всё равно присутствует, следовательно, частью OpenOS считать это ошибочно.
    Запомнил? Молодец. И больше не задавай глупых вопросов.

    Сложность: средне 40%
    Скучность: средне 35%
    Дубовость: для начинающих 30%

    Как и обещал, в этой части я поговорю о структуре ФС уже самой OpenOS и о первых инструментах, предоставляемых системой. 



    СТРУКТУРА ФАЙЛОВОЙ СИСТЕМЫ OPENOS
    Файловая система OpenOS чрезвычайно похожа на оную из *nix. Сразу же после установки системы, у Вас появляются следующие папки: / // Корень|+ bin // здесь хранятся программы самой ОС|+ boot // здесь хранится загрузочный код ОС|+ etc // здесь хранятся файлы конфигурации| || + rc.d // папка скрипта-демона|+ lib // здесь находятся бибилиотеки самой ОС|+ usr // все пользовательские файлы | + man // папка файлов справочной системы | + misc // папка различных файлов
    Допустим, мы хотим узнать, какие программы есть в OpenOS. Для этого заходим в директорию /bin/ (см. часть первую, если не помните, как) и смотрим содержимое через ls. Поразившись количеством программ, можно выходить из директории. К ним мы вернёмся позже.
     
    mkdir
    Но вот, например, вам захотелось страстно создать в корне папку /kotiki/. Для этих целей присутствует утилита mkdir <имя папки>. В нашем случае нужно ввести mkdir /kotiki/. Обратите внимание, что не рекомендуются в названии папок пробелы и спецсимволы (могут возникнуть сложности с программами, но если Вы решились так делать, то заключите путь в "кавычки"), и называть папку так же, как файл на диске, не следует.
    К слову, если нужно сделать две папки, можно обойтись одной командой: mkdir <имя папки> [имя второй папки] [имя третьей папки] [...]. Тогда достаточно прописать, например, mkdir /kotiki/ /sobaki/, чтобы создать папку "kotiki" и "sobaki".
    К слову, сразу же после установки, пропишите команду mkdir /usr/bin/ /usr/lib. Это понадобится.
     
    rm
    Предположим, что вы по ошибке прописали mkdir /koriki/. Возникает вопрос — как удалить папку? Для этого предназначена команда rm <имя файла или папки> [имя второго файла или папки] [...]. Нужно удалить только одну папку, потому пишем: rm /koriki/ — и создаём правильную папку. Напомню, что rm может удалять ещё и файлы.
     
    mv
    Что, если Вам хочется не удалять всю папку, а только переименовать её? Или перетащить с диска на дискету? Воспользуйтесь командой mv <имя файла/папки> <место назначения>. Например, чтобы переименовать /koriki/ в обыкновенных котиков, пропишем mv /koriki/ /kotiki/
     
    cp
    Куда же мы без копирования! Как в любой уважающей себя ОС, здесь тоже есть такая функция. cp <путь к копируемому файлу> <путь в место вставки файла>. Например, cp ../cat1/ ./.
     
    edit
    Но довольно возни с папками — мы пришли программировать! А не в папках копаться. Для создания и/или редактирования файла нужно прописать edit <имя файла>. Откроется редактор файлов. Управление такое же, как, например, в блокноте. Стрелочками перемещаться, ввод стандартный. Вот только для управления файлом вместо меню используются "горячие клавиши":
    [Ctrl] + — сохранение файла [Ctrl] + [w] — закрытие файла (файл НЕ сохраняется!!) [Ctrl] + [Del] — удаление строки [Ctrl] + [f] — поиск [F3] или [Ctrl] + [g] — поиск следующего совпадения

    Внизу справа отображается текущая позиция курсора.
     
    Запуск программ. PATH
    Чтобы запустить свою программу, пропишите путь до неё (например, myfirstprogram.lua). Если у файла расширение .lua, то писать его необязательно. Кроме того, если программа находится в /bin или /usr/bin (Ваши программы советую сохранять в последнюю папку), то вызвать их можно, просто прописав название программы без расширения, причём в любой папке. Именно так и работают стандартные программы (например, cd, mkdir и др.)
    То есть, при попытке запустить файл какой-либо, сначала обыскиваются директории в PATH (это /bin и /usr/bin) и, если программы такой не найдено, система пытается запустить файл в текущей директории.
    Если у Вас в текущей директории есть файл rm.lua, то, чтобы не запускать стандартную утилиту, пропишите ./rm.lua. Если указана директория в пути, то поиск в PATH пропускается.
     


    ДРУГИЕ СТАНДАРТНЫЕ ПРОГРАММЫ OPENOS
    man. Справочная система
    На этой команде я мог бы и закончить описание системы, так как для большинства стандартных программ есть описание в man. man — это команда, которая открывает файл справочной системы для чтения. Начните с man man. Вам расскажется о программе. А теперь пропишите команду ls /usr/man/. Вы увидите список файлов справочной системы. Например, resolution. Для просмотра файла пропишите man <название файла справочной системы>. В данном случае — man resolution. Для каждой изученной ранее команды прочитайте справочную информацию, чтобы Вы могли использовать их на полную силу.  
    cat <имя файла>
    Простой просмотр содержимого файла. Нет возможности управления курсором, если содержимое больше высоты экрана — всё, ничего не поделать (на самом деле, это не так, с помощью more можно сделать это удобным, но для использования потребуется пайпинг, о котором я поговорю в другой раз).
     
    clear
    Очистка терминала.
     
    date
    Выводит текущие время и дату.
     
    echo
    Просто выводит данную строку на экран (echo [строка]) Строку желательно заключить в "кавычки", чтобы избежать разных проблем. В простом виде бессмысленна, нужна опять-таки для пайпинга.
     
    install
    Скопировать полностью содержимое всей файловой системы на другой накопитель, вместе со всеми Вашими файлами.
     
    ln <путь к файлу> [место назначения]
    Создать сиволическую ссылку на данный файл. Если место назначение не указано, то в текущую директорию вставляется ссылка с именем файла. К слову, эти ссылки виртуальные и не хранятся на файловой системе. После перезагрузки компьюетра они стираются. Таким образом, они могут создаваться даже на системах только для чтения!
     
    pwd
    Выводит на экран текущую рабочую директорию. Полезно, опять же, при пайпинге.
     
    reboot
    Перезагрузка системы.
     
    shutdown
    Остановка системы.
     
    resolution
    Изменение расширения экрана. Синтаксис: resolution <X> <Y>. Максимальное разрешение зависит от монитора и видеокарты.
     
    uptime
    Время работы системы
     
    which <файл>
    Выводит путь до указанной программы или сиволической ссылки. Например, which rm выведет /bin/rm.lua.
     
    yes [строка]
    Бесконечно повторяет заданную строку, или "y", если не задано. Сомнительная полезность.

    Списка терминов тут не будет, так как придётся копировать информацию из статьи. Всё, что было изучено — это программы и структура ОС.

    Да и на самом деле, я рассмотрел далеко не все программы и возможности, имеющиеся в OpenOS. В следующей части — о пайпинге и устройствах, а также о программах, с ними связанных, так что не пропустите, если Вам интересно.

     


    ← →

  25. Fingercomp
    Приветствую Вас в очередной записи. Решившись, что отвечать на вопросы типа "как скопировать программу на дискету" каждому проходящему — непозволительная роскошь, я и пишу это здесь. Цель: описать процесс постигания магии бессменных белых букв на чёрном фоне, да так, чтобы это было непонятно всем. Эта часть будет необычной в цикле, так как именно сюда я буду выливать прогресс и делать обновления.
    Что же, запаситесь терпением и приготовьтесь скучать, да так, как Вы ещё не скучали, ибо именно в этой Башне лежат все скучные вещи.


    Сложность: просто 25%
    Скучность: средне 65%
    Баланс дубовости: для начинающих 20%

    Опустим такую невероятно сложную вещь, как установка системы, о которой уже было рассказано на нашем форуме. Вы вытащили дискету, нажали [y] и затем [Enter], готовите уже свою мышку к кликательным пыткам, надеясь, что эти буковки на чёрном фоне до установки — всего лишь результат лени разработчиков, дожидаетесь загрузки и... "О, святые криперы, что это?! Они меня замучать хотят этими буковками непонятными?!"
    Что же, приветствуем Вас на борту этой замечательнейшей операционки, работающая на чистом Луа. Основные принципы: Вы можете выкинуть свою мышку (чего, к слову, мы делать не советуем). Всё управление идёт через клавиатуру, как минимум, в стандартных программах. Эта штука чрезвычайно похожа на ОС типа *nix. Если эти 4 знака Вам знакомы, понятны и не вызывают страха — поздравляю! Вы уже на 90% владеете инструментом. Вся система — это такой большой Проводник. Можно путешествовать по разным папками и смотреть их содержимое.



    Первым делом сразу советую выучить английский, хотя бы немного. Всё потому, что русского языка вы просто так не увидите. Документация на английском, подсказки на английском, команды на английском, в общем — всё на иностранном языке. Выучили? Тогда приступим.

    И вот, прочитав истинно скучную штуку (или пропустив, но это не по-крутому, знай), мы трём носик об этот квадрат Малевича, исписанный в лучших традициях русского народа надписями типа "здесь был Вася" "RAM", "OpenOS" и какого-то магического заклинания. И всё — в белой рамочке. А ниже нарисовано решето. Мигает штука, похожая на детальку из "Лего". В общем, непонятно даже, как можно пользоваться такой штукой.  


    ФАЙЛОВАЯ СИСТЕМА
    CWD и ls
    Итак, представьте, что Вы открыли проводник. И сейчас Вы находитесь в папке "/", о чём говорит (-ят) символ (-ы) слева от решётки. То, что там написано, называется текущей директорией. По-английски — CWD (Current Working Directory). Проверить, что находится в текущей директории, поможет команда ls. Введите команду и нажмите [Enter]. Отобразится список файлов, причём, если у Вас монитор второго и третьего уровней, то синим будут обозначены директории, жёлтым — ссылки, а зелёным — программы. Иначе ­же всё будет белым цветом.  

    cd
    Сложно? Это ещё только начало. Допустим, что список файлов в текущей директории Вас не удолевтворил, и Вы хотите большего. Что насчёт перехода в другую папку? В Проводнике вы кликали 2 раза по ней — здесь же придётся вводить имя папки вручную. Команда: cd <имя папки>. Обращаю внимание, что угловые скобки писать не нужно. Они показывают, что аргумент программе обязателен. Впрочем, об этом в другой раз. Допустим, нам вдруг страстно захотелось в папку /bin/. Пишем: cd /bin/. Вуаля! Слева от решётки появляется надпись /bin, и Вы оказываетесь в другой папке.
     

    Пути
    Итак, мы в /bin/. Думаю, нужно ознакомиться с файловой системой ОС. Для каждой папки есть:
    содержимое родитель корень путь

    Содержимое папки мы узнавать умеем — командой ls. А что такое родитель, корень и путь?
    Допустим, есть папка "Файлы". В ней — ещё 2 папки, "Документы" и "Программы". В папке "Документы" будут файлы "отчёт001", "отчёт002" и "отчёт003". В папке "Программы" — "Программы2" и "Игры". Итого, структура нашей системы такова (структура — это описание всего содержимого папки. Называется часто деревом):
    + Файлы | + Программы | | | + Программы2 | | | + Игры | + Документы | + отчёт001 + отчёт002 + отчёт003
    Как видно, файл "отчёт003" находится в папке "Документы". Поэтому, для файла "отчёт003" родителем будет папка "Документы". В общем, это папка, в котором лежит файл или папка. Для "Документы" родитель — "Файлы", для "Игры" — "Программы", для программы — снова "Файлы". Вот так всё запутанно.
    Далее. Взгляните на дерево ещё раз. Как видно, у папки "Файлы" нет родителя. Эта папка называется корнем файловой системы. Все остальные папки так или иначе находятся в корне.
    Путь — это последовательная запись вложенных структур до нужного файла. Сначала папка "Файлы", в ней — папка "Документы", в "Документах" — "отчёт001". Следовательно, у файла "отчёт001" путь следующий: Файлы/Документы/отчёт001.
    В OpenComputers корнем является папка /, с которой всё и начинается. Следовательно, если папку "Файлы" поместить в "/", то для перехода в папку с файлом "отчёт002" можно прописать команду cd /Файлы/Документы/
     

    Абсолютные и относительные пути. ./ и ../
    Если путь начинается с корневой директории, то он абсолютен. Но есть пути относительные данной директории. Например, путь к папке "Игры" относительно "Программы2" таков: ../Игры/. Заметили ../? Этот путь есть в каждой папке и обозначает родительскую директорию (для корня ведёт на саму себя). То есть cd ../ переходит на директорию выше. Если прописать эту команду, находясь в папке "Игры", то Вы окажетесь в папке "Программы". Далее — в "Файлах", а так как это корень, то продолжение ввода не будет менять рабочую директорию.
    Кроме того, папка ./ ведёт на саму себя. То есть Файлы/ равен, например, Файлы/./././././././.
     
    И, напоследок, чтобы просмотреть список файлов без перемещения в нужную директорию, пропишите ls [путь до папки]


    Изначально, я продолжил запись описанием реальной файловой системы на ОС, но решил сократить объём повествования. Потому в следующей части — редактор, справочная система, объяснение структуры папок на ОС. В конце я привожу список новых слов и терминов: текущая директория — папка, в которой Вы находитесь. Известна как CWD (Current Working Directory) ls — просмотр содержимого текущей директории cd <путь> — перемещение по файловой системе структура — описание содержимого директории. Также известна как дерево родитель — предыдущая по вложенности папка. Директория, в которой расположен текущий каталог корень файловой системы — папка, не имющая родителя. Первая по вложенности. В OpenComputers — / путь — последовательная запись вложенных структур до нужного файла абсолютный путь — путь от корня до нужного файла/каталога относительный путь — путь от текущей директории до нужного файла/каталога ../ — ссылка на родительскую директорию ./ — указывающая на саму себя папка ls [путь до папки] — просмотр содержимого заданного каталога



    Повествование запутанное, сумбурное и непонятное, в лучших традициях Башни. Специально писал ночью для такого эффекта. Но, к сожалению, следующая часть будет веселее и активнее, с картинками и красотой. Жду оценок 1/5, игнорирования и злостных комментариев из-за этого.  




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