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

Лидеры


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

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

  1. 1 балл
    Автор темы давно не появлялся здесь, но я попробую ответить за него. На computercraft.ru обычно приветствуется развитие любых наработок, необязательно своих. Но если часть кода позаимствована, то очень желательно указать автора со ссылкой на его наработки. Также в описании своего творения желательно указать, что именно было позаимствовано, что было выполнено самостоятельно, что переработано, и в чём преимущество этих доработок.
  2. 1 балл
    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 Хотя я бы, конечно, не советовал так делать. Очень неудобно потом останавливать другие программы: приходится перезагружать компьютер.
  3. 1 балл
    Предисловие Я думал на новый сервер запилить прогу — мост между чатом сервера и IRC. У меня уже были такие программки: я насчитал минимум 6 различных версий мостов — каждая была немного переделанным клиентом IRC, который на дискете встроенной есть. Понять, в чём разница, даже с вимдиффом было сложно. Потому я плюнул и решил запилить полноценную ирколибу с красивой апишкой. Как это выглядит Вот полный код бота — моста. Сто двадцать шесть строчек. Прокомментирую некоторые из них. ① Подключаем либу и для укорачивания имён ещё вытаскиваем events, в которых хранятся все ивенты и priority. ② Создаем клиент с помощью билдера. ③ Через :connection задаём настройки соединения. Самое важное — адрес иркосервера. Порт обязателен. ④ Ирколиба знает меру в флуде. Опасаться, что бота выкосит флуд-фильтром, можно гораздо меньше. Это опционально, конечно. ⑤ Задаём ник бота, юзернейм и реалнейм. Юзернейм виден в хосте (nickname!username@domain.name), а реалнейм пишется в /whois. ⑥ Ирколиба умеет авторизовываться на сервере. Тоже опционально. ⑦ Эта группа выделена для ботоводческих настроек. Но пока там единственная опция — в какие каналы автоматически заходить. ⑧ Здесь задаются настройки исполнения. Опция threaded, по дефолту включённая, запустит бота в отдельном треде. Опция reconnect, также включённая по умолчанию, заставит бота переподключиться к серверу, если отвалится от него. Опция catchErrors перехватит ошибки в пользовательких листнерах; она отключена по умолчанию, чтобы не смущать. ⑨ Бот генерит ивенты для каждого сообщения. Так мы задаём обработчик для ивента. К слову, вместо функции здесь может быть корутина. ⑩ Есть и другие события. Например, irc.events.client.connected означает, что клиент соединился с сервером. А irc.events.client.authenticated говорит, что теперь можно слать сообщения. ⑪ Когда мы закончили конфигурировать бота, собираем через :build(). Если вместо него вызвать :buildAndRun(), бот тут же ещё и запустится. ⑫ Для удобства создадим ещё один тред, где будем работать с чатбоксом и ждать ^C. ⑬ Запускаем бота. Затем ждём завершения любого из двух потоков. ⑭ Когда это произошло, мы выключаем клиент, если он ещё подключен: тот выйдет с сообщением "Quitting." ⑮ Наконец, принудительно останавливаем потоки. На всякий случай. Красота ведь. Репозиторий Репа либы — на нашем гитлабе. Там же есть примеры использования и документация с описанием всего. Наконец, версия 1.0.0 лежит на хеле. Из-за баги в OC хпм крашиться может (фиксить лень), но можно попробовать скачать: $ hpm install libirc
  4. 1 балл
    WinDOS 1.0 п.с. Придумываю названия майнкрафт оськам на луа, рисую логотипы фломастерами, упаковка, реклама, маркетинг, доставка на дом, опт и розн. 3 года на рынке. Москва, Басманный пер., д.5/13, неприметный подвальчик с черного входа с вывеской "Даем названия оськам" , спросить Эдуарда Вениаминовича Копалкина или уборщицу бабу Клаву. Недорого. Гибкая система скидок. Тел. +7 (495) 555-01-21.
  5. 1 балл
    Переключение рабочих столов теперь работает! Делается это командой workspace Переключение занимает определенное время(0.5 сек), потому что в этот момент происходит считывание файла-скриншота с диска и восстановление той картинки, которая была отображена на рабочем столе
  6. 1 балл
    Теперь дебажить программы намного удобнее:
  7. 1 балл
    Сейчас допиливаю оконный менеджер. Добавил возможность делить окно на 2 части командой split
  8. 1 балл
    Немного перемудрил с переменными, смотрите как сразу перекосило ее
  9. 1 балл
    Вот какое чудо удалось сделать: Теперь каждый сможет запускать несколько lua-интерпретаторов, редакторов кода, GUI-программ и распределять их по рабочим столам Я запускал эту программу на компе с 1МБ ОЗУ P.S. Наконец-то приручил стандартный OpenOS-терминал
  10. 1 балл
    На мой взгляд, разрешение ОС-монитора не такое большое, чтобы делить его на окна. Если бы я стал писать многозадачную операционку, разделение экрана я бы реализовал не как в Windows, а как в Androidе. Т.е. из всех запущенных приложение только одно захватывает экран, оно же обрабатывает события мыши и клавы. Остальные приложения крутятся в фоне и если что-то пишут, то на свой виртуальный экран. Но, это лишь мое скромное мнение.
  11. 1 балл
    Реализовал часть функций оконного менеджера. Реализовал переключение окон
  12. 1 балл
    Вот еще интересный, красочный пример. Запустил две змейки на одном компе: Проблема только в том, что обе змейки реагируют на нажатия клавиш, но эта проблема легко решаемая P.S. Программу "змейка" я скачал с форума и запустил в своей ОС без каких-либо доработок
  13. 1 балл
    Реализована возможность запуска нескольких программ одновременно!!! В этом примере каждая программа запущена в отдельном окне 10х10 символов. Это 2 одинаковых программы. Эта программа будучи запущенной в "одиночном" режиме занимает все окно: Примечание: в скиншоты попал мой терминал(фиолетовая область). Я криворукий и мне лень переделывать Программы запущены в эмуляторе, так что они работают намного быстрее. Пока еще не тестил в майне
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...