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

Лидеры


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

Показан контент с высокой репутацией 26.10.2021 в Сообщения

  1. 1 балл
    Сидел читал форум, наткнулся на тему "Управление роботом с планшета" и сразу понял что моего ума хватит на создание программы которая позволит управлять роботом с НАСТОЯЩЕГО ТЕЛЕФОНА на системе android. И так, представляю вам - RRCM - Robot Remote Controll Mobile Что вам понадибится? 1. Телефон на android 2. Робот с минимальными компонентами и open os 3. Интернет карта на роботе Установка: 1. На робота ставим программу RRCM (pastebin get y2Twekz8 RRCM) 2. Ставим серверный скрипт на сервер/свой пк(если порт 5000 открыт): -- 1. Ставим python -- 2. После установки python3 вводим в терминал/cmd команды: "pip install flask" "pip install flask-restful", также если в четвёртом шаге у вас возникнет ошибка, пробуйте "pip3 вместо "pip" -- 3. Скачиваем скрипт - *тык* -- 4. Запускайте скрипт(windows: двойной клик по скрипту, linux: "python3 название_скрипта" 3. Ставим приложение на android - *тык* 4. Запускаем приложение, вводим только домен/ip:port нажимаем connect - если появляются кнопки управления - работает, если приложение виснет - какая-та проблема(скорее всего приложение не видит сервер 5. В скрипте RRCM на роботе изменяем локальный ip:port на ваш домен/ip:port 6. Запускаем RRCM на роботе. 7. Всё должно работать. Если у многих будут проблемы, запишу видео. В будущем планирую сделать скрипт на EFI что-бы не тратится на диск. Не удивляйтесь малому функционалу, проект был заброшен 2 раза, скоро сделаю обнову. (возможно) UPD: Забыл сказать! Для остановки скрипта надо перезагружать робота, но в скором времени сделаю кнопку в приложении для остановки скрипта Если будут ошибки - пишите, разберусь. UPD2: Если вы боитесь за безопасность устройства то вот вам исходник приложения - *тык* Приложение билдить на андроид в unity
  2. 1 балл
    Посмотрел я на тему "Возрождаем OpenNet (не опять, а снова)" и ради интереса решил накодить свою реализацию. Так вот. Представляю NetQuartz. Что эта ерундовина может: Многоуровневые IP адреса. Можно хоть 1.2, хоть 26.89.1.2, хоть 734.84.1.97.73.4, все зависит от вложенности роутеров. Встроенный DNS. Простенький веб-сервер и браузер с поддержкой цветов. Простая регистрация устройства в сети (хочешь подключиться - поставил ПО на клиента, написал одну команду - все готово!) Что она пока не может: Нема API. Нема всяких <hr> <a href> и прочей фигни. Ну и браузер бы полностью гуишным сделать. Тестил только на проводных подключениях! В теории конечно и вайфай должен работать, но в теории. Что она не может и добавлять не планирую: Шифровка трафика и прочая ерунда с безопасностью Терминология: роутер == маршрутизатор Корневой роутер (сервер), корень [сети] - основой компьютер, связывающий маршрутизаторы и клиентов, выполняющий функции DNS сервера и лежащий в иерархии сети выше всех. Всегда имеет IP 0.0. В одной сети может быть только 1. Маршрутизатор, роутер - компьютер, обеспечивающий перенаправление пакетов (маршрутизацию) от отправителя к получателю. Пакет (в контексте данного проекта) - 4 текстовых поля - Отправитель, Получатель, Тип, Данные Клиент - Любой компьютер / планшет / микроконтроллер / дрон / робот, подключенный к сети, являющийся конечным узлом. (То бишь, не имеющий дочерних узлов.) Узел - любое устройство в сети. Как это все работает: В контексте данного раздела "послать" == modem.send(). Все работает на 1110 порту. Если пакет типа DATA или DNSANSWER (в последнем случае 3-ий шаг выполнятся не будет, т.к. пакет уже послан с корня сети.): Клиент-отправитель посылает пакет на роутер, который его зарегистрировал в сети. Роутер получает пакет. Теперь есть несколько вариантов обработки: 1. Получатель находится в подсети роутера (включая вложенные подсети): роутер находит MAC узла, находящегося в адресе получатеся сразу после IP данного роутера и посылает на него пакет. Здесь неважно, является ли этот узел роутером или уже клиентом. Если получит роутер - пункт 2 повторится. 2. Получатель находится вне подсети роутера: Здесь еще проще - роутер просто посылает этот пакет родительскому узлу. Корневой сервер получает пакет. Данный шаг будет проделан, только если во время 2-ого шага роутеры добросали пакет вверх прямо до корня (например, в случае если отправитель 1.2, а получатель 2.3). Тут происходит все то же самое как и в 2.1. Клиент-получатель принимает пакет. На этом путь пакета завершен. Как он будет обработан - определяет ПО. Если пакет типа DNSREG или DNSLOOKUP: Клиент-отправитель посылает пакет на роутер, который его зарегистрировал в сети. Роутер получает пакет и перенаправляет его на родительский узел. Так повторяется, пока пакет не достигнет корня. Корень получает пакет, обрабатывет его и посылает ответ в виде DNSANSWER пакета. Если пакет типа FINDPARENT: (эти действия происходят при вып. кмд qclient find. При исп. другого ПО алгоритм обработки пакетов на стороне клиента может отличаться.) Клиент-отправитель посылает пакет методом broadcast. В поле данные указано "find". Любой роутер, получивший это отзывается сообщением (не пакетом) "FINDROUTER:ME". В т.ч. и корень. Клиент получает самый первый пакет и отсылает обратно уже методом send пакет FINDPARENT. В поле данные уже указан MAC роутера, на котором клиент желает зарегистрироваться. Собственно на этот же MAC и отсылается пакет. Роутер, получивший пакет, сравнивает свой MAC с указанным, и если они совпадают, то выдает клиенту IP и отсылает клиенту сообщение (не пакет) с его IP. Клиент сохраняет все в qclient.conf в формате MACродителя;свойIP. Железо и ось: Требования по железу: Обязательная сетевая карта. Минимум 25КБ свободного дискового пространства. Видеокарта 1+ ур. Рекоменд. дисплей. Процессор мин 1+, рекоменд 2+. ОЗУ не тестил. На тестовых компах стояло 2*2уровень На всех тестовых компах стояла ОпенОСЬ из коробки без модификаций. Как этим безобразием пользоваться: Создаем корневой сервер: Качаем на него root.lua и ttf.lua в папку /home/. Создаем папку /home/QuarksRouter/. Запускаем root.lua Создаем роутеры: Качаем unit.lua и ttf.lua в папку /home/. Создаем папку /home/QuarksRouter/. Подключаем и запускаем роутеры: Качаем qclient.lua в папку /home/. Пишем qclient find. После запускаем unit.lua Подключаем клиентов: Качаем qclient.lua в папку /home/. Пишем qclient find. Настраиваем веб-сервер: Качаем server.lua, желательно в папку /home/QServer/. Там же создаем папку /home/QServer/mctpdocs/, в нее будем пихать странички. ОБРАТИТЕ ВНИМАНИЕ! Страницы без расширений. Домашняя - index. Делаем странички: Пихаем файлы без расширений в папку /home/QServer/mctpdocs/. В них пишем любой текст. Поддерживается цветовое форматирование как в обычном майне, с помощью &. Также можно менять фон. Для этого пользуемся теми же колоркодами, только с префиксом не &, а ^. Запускаем сервер server.lua Ставим браузер на клиента: Качаем web.lua. Пишем web <url>/<page> (web test.low/test) для доступа. Регистрируем домен: На веб-сервере пишем qclient -p -l --r="0.0" --d="DNSREG;тутжелаемыйдомен". Собственно все. Гайд по qclient: -p - обязательно писать -l - слушать входящий пакет --r="ip.получателя" --d="типпакета;данные" Гайд по пакетам: Формат пакета: IPотправителя;IPполучателя;тип;данные Возможные типы: DNSREG - регистрация домена. В поле ДАННЫЕ пишем желаемый домен DNSLOOKUP - поиск ip по домену. В поле ДАННЫЕ пишем желаемый домен. DATA - пакет с данными. Типы, которые юзать нежелательно: DNSANSWER - ответ корневого сервера. В поле ДАННЫЕ указано QDNS:ответ. FINDPARENT - единственный broadcast-пакет. Регистрация в сети. Ссылки: root.lua https://pastebin.com/BDBsU4qm unit.lua https://pastebin.com/drZQ4MD0 qclient.lua https://pastebin.com/wMZqWwwL ttf.lua https://pastebin.com/rhbG8CW8 server.lua https://pastebin.com/mjzSm4Hi web.lua https://pastebin.com/xNYssMWc P.s. это мой первый проект на луа.
  3. 1 балл
    Хэй, у меня тут зачесались ручки накодить какую-нить игрульку под MineOS (а то их что-то совсем мало). Ну и я вспомнил, что угадайка была в первых версиях оси (еще на основе OpenOS). Ну, короче, GuessWord for MineOS. Из основных отличий: Игра переписана с нуля для поддержки GUI оськи. Более минималистичный и однотонный интерфейс (современная мода, а вы как хотели) Увеличен размер окна, элементы теперь крупнее. Поддержка нескольких языков (раскладка клавиатуры описывается в файле локализации, размеры не более 13х3) Поддержка ввода с реальной клавиатуры К сожалению, у меня пока еще нет базы слов для английского языка, поэтому, если кто хочет помочь с составлением, пишите сюда или в дискорд: Bs()Dd#5299. Скачать игру можно в MineOS App Market. Репозиторий на GitHub.
  4. 1 балл
    Сделаю уточнение. Дело оказалось вообще не в этом. Все эти вспомогательные операции слишком мелкие, чтобы принимать их в расчёт. Главная причина в том, что сама по себе операция деления целых чисел в моей модели процессора выполняется медленнее, чем операция деления вещественных чисел в регистре SSE. Время деления на константу со значением 5 отличается примерно в два раза. Я сам решил проверить эту гипотезу, и она также не подтвердилась. Сама проверка оказалась не такой простой, как мне казалось на первый взгляд. Компилятор довольно хорошо оптимизирует код, заменяя операцию деления на константу операциями умножения и сдвига. В результате возникает иллюзия, будто бы целочисленное деление выполняется в три-четыре раза быстрее вещественного. Но это не так. Проверить это можно построением ассемблерного листинга. Мне пришлось постараться, чтобы компилятор перестал воспринимать содержимое переменной как константу, и наконец-то использовал операцию деления. Также умный компилятор вообще отказывался создавать код, если его результат не использовался в дальнейшем. Поэтому, в отличие от Lua, недостаточно просто сохранять результат в какую-то переменную. Этот результат надо где-то использовать. Также я пробовал отказаться от оптимизаций на этапе компиляции. Но в этом случае результат получается менее точным. В зависимости от выбранного способа записи результат может измениться не только количественно, но и качественно. Оптимизированный код обеспечивает более повторяемый результат. Эксперимент получился недостаточно чистым. Поэтому его полезно было бы повторить в кодах ассемблера, чтобы не продираться сквозь особенности компилятора. Но я пока не до конца осилил синтаксис ассемблера AT&T. Поэтому рабочая гипотеза такова: операция vdivsd процесcора Intel выполняется быстрее idivq.
  5. 1 балл
    loadfile("file")(loadfile) component.list("gpu", true)() Что именно означают вторые пары скобок? Для чего они нужны?
  6. 1 балл
    Вторые пары скобок вызывают функцию так же, как и первые пары. loadfile("file") в качестве результата возвращает функцию. И для её вызова требуются скобки. component.list("gpu", true) возвращает итератор, перечисляющий все компоненты заданного типа. Но для получения первого компонента в списке этот итератор можно вызвать как функцию, что так же достигается использованием скобок.
  7. 1 балл
    Я о том же, зато оптимизировали. Если представить себя мыжпрограммистами и провести аналогию с реальностью, то команда просто так потратила время на преждевременную оптимизацию. Обязательно к прочтению
  8. 1 балл
    Тем временем начинающий криптодиггер использовал функцию, которую ему оптимизировали всем форумом, только в комментах. Потом вообще убрал её.
  9. 1 балл
    io.read занимает поток исполнения тем что ожиданиет событие и нажатие Enter, в твоём случае тебе нужно отдельно обрабатывать событие key_down и modem_message - тогда появится видимость многопоточности или использовать библиотеку thread. Да, код в тег обернуть бы, а лучше на пастбин аплоднуть.
  10. 1 балл
    Скорее всего половина, а то и больше ошибок пропадут как только там будет стоять } в конце
  11. 1 балл
    не не база данных просто типо жилище умное
  12. 1 балл
    Lua не перестаёт удивлять. $ lua5.3 -e 't0=os.clock()local v for i=1,1e9 do v=i//1.0 end print(os.clock()-t0)' 11.848781 $ lua5.3 -e 't0=os.clock()local v for i=1,1e9 do v=i//1 end print(os.clock()-t0)' 16.08497 Операция целочисленного деления на целочисленную константу работает медленнее, нежели на константу с плавающей точкой. Соответственно, округление (val+0.5)//1.0 также будет выполняться быстрее, чем (val+0.5)//1.
  13. 1 балл
    В общем случае Lua не имеет простого и быстрого механизма сравнения двух произвольных таблиц. В промежуточных случаях есть возможность применить некоторые трюки для ускорения операций. Предлагаю понаблюдать за работой этих команд: component.inventory_controller.store(1,1,component.database.address,1) component.database.computeHash(1) component.me_interface.getAvailableItems()[1].fingerprint.nbt_hash Первая команда запоминает в первом слоте апргейда базы данных информацию о предмете, находящемся в первом слоте сундука, стоящего над контролером инвентаря. Вторая команда вычисляет хеш информации о предмете с учётом NBT-тегов. Третья команда также получает хеш, но уже от МЭ-сети и исключительно NBT-тегов. То есть, два разных предмета, но с одинаковыми тегами будут иметь одинаковые хеши. Этот подход также имеет некоторые сложности: Эти хеши не совпадают, но ассоциативные возможности таблиц Lua позволяют упростить преобразования хэшей. На каждую операцию требуется один тик времени. И если прочитать содержимое МЭ-сети можно за одну операцию, то на обработку каждого слота сундука требуются две операции. Это может представлять проблему для сундуков со свободным доступом для игроков, но информацию о содержимом сундуков с исключительно программным доступом можно кешировать, чтобы избегать повторных вычислений. В конкретно этом случае также возможны хитрости. Необходимость частично игнорировать информацию о предмете делает невозможным прямое использование хешей. Но есть возможность заранее составить таблицы подходящих хешей с учётом вариаций показателей, которые требуется игнорировать. И даже если предварительное формирование и хранение таких таблиц представляет трудность, варианты оптимизации всё равно остаются. Например, можно хранить таблицы хешей только для пчёл, хранящихся в общей МЭ-сети, а для работы с пасеками применять отдельную МЭ-сеть, которая позволит анализировать всех вновь поступивших пчёл и хранить только актуальные хеши.
  14. 0 баллов
  15. 0 баллов
    Я сижу и надумал сделать себе что то типа смс, но, когда запускаю сравнение с even.pull даже с задержкой 2, оно не даёт пользывателю написать сообщение, выглядит это примерно так: запрашиваем от сервера свободный порт, получает его и сравнивает цифра, ставит отметку на тот порт который ему прислал сервер, открывает его, после ждёт сообщения(even.pull) и ждёт сообщения для отправки(io.read) если сообщение отправлено то оно посылает порт для получателя и само сообщение, сервер отправляет сообщение по порту на планшет (или ПК) но указанный порт, если мы введём exit то мы отправим что ранее записанный порт программой свободен сервер отметит, и мы закрываем порт, если сообщение приходит, то мы выводим его на экран. Также может прислать просто пустое сообщение. извините что так много но я очь много времени потратил ;-; event = require('event') cmp = require('component') os = require('os') modem = cmp.modem print('удачность соединения:') print(modem.open(1)) two = false thre = false four = false five = false beep = cmp.computer.beep() function prog() while boo == false do _, _, _, _, _, sus = event.pull("modem_message") print(sus) if sus == 'sms_chek' then if two == false then modem.broadcast(16, '2') print('послано 2') two = true else os.sleep(0.5) if thre == false then modem.broadcast(16, '3') print('послано 3') thre = true else os.sleep(0.5) if four == false then modem.broadcast(16, '4') print('послано 4') four = true else os.sleep(0.5) if five == false then modem.broadcast(16, '5') print('послано 5') five = true else print('ОШИБКА, НЕТ МЕСТ <SMS>') end end end end end if sus == 'sms_exit' then _, _, _, _, _, oi = event.pull("modem_message") if oi == '2' then two = false else if oi == '3' then thre = fasle end end if oi == '4' then four = false else if oi == '5' then five = false end end end if sus == 'sms_messege' then _, _, _, _, _, s = event.pull("modem_message") os.sleep(1) _, _, _, _, _, sms = event.pull("modem_message") if s == '' then print('чуть не произошла ошибка') else print('oправленно: ' .. sms .. ' ' .. 'на порт: ' .. s) portsms = tonumber(s) smska = sms modem.broadcast(portsms, 'SMS') os.sleep(1) modem.broadcast(portsms, sms) end end end end boo = false function shell () while exit == false do as = io.read() if as == 'exit' then exit = true end end end shell() prog() ето код сервера реально много получается код: планшета: local cmp = require('component') local modem = cmp.modem local event = require('event') local exit = false print(modem.open(16)) local a = 0 modem.open(16) sms = '' while sms == '' do modem.broadcast(1, 'sms_chek') print('попытка соединения с сервером') _, _, _, _, _, sms = event.pull("modem_message") if sms == '2' then modem.close(16) modem.open(2) port = '2' print('порт: 2') print(modem.open(2)) else if sms == '3' then modem.close(16) modem.open(3) port = '3' print('порт: 3') print(modem.open(3)) else if sms == '4' then modem.close(16) modem.open(4) port = '4' print('порт: 4') print(modem.open(4)) else if sms == '5' then modem.close(16) modem.open(5) port = '5' print('порт: 5') print(modem.open(5)) end end end end end smsRAM = false RAM = '' function send () while exit == false do _, _, _, _, _, sms = event.pull(2, "modem_message") if sms == '' then else if sms == 'SMS' then print('получен смс:') _, _, _, _, _, sms = event.pull(2, "modem_message") RAM = sms smsRAM = true print(sms) end end local sa = io.read() if sa == 'exit' then exit = true modem.broadcast(1, 'sms_exit') modem.broadcast(1, port) cmp.computer.beep() else modem.broadcast(1, 'sms_messege') os.sleep(1) modem.broadcast(1, sa) local sa =io.read() modem.broadcast(1, sa) print('отправлено') end if sa == '' then if smsRAM == true then print(RAM) smsRAM = false end end end end send() еше раз извините что много, прост хочется решить проблему
  16. 0 баллов
    Пока что приложение не до конца разработано, есть только сервер и скрипт для робота. Так что - ждите, мои дорогие форумчане. Для чего это нужно? Каким то образом, вы узнали что вас гриферят(допустим так) и решили не отдавать свои ресурсы и взорвать всё к чертям! Но вы не можете зайти на сервер или вы даже не дома! Просто взорвите свой дом роботом! ИЛИ Захотели потроллить друзей? Выйдите с сервера и начните управлять роботом! Они точно афигеют, особенно если их дома будут подорваны роботом. ИЛИ Сидите вы значит на диване и вам лень подойти к компу что-бы что-то сделать? Решение есть! Просто сделайте это с помощью телефона и робота! Выпуск первого релиза был назначен на 30.08.2021, но у меня юнити решила не качать Android Support для билда приложения. Постараюсь как можно быстрее поставить андроид саппорт и дам вам наконец эту безделушку. P.S. В первом релизе будет крайне малый функционал в виде передвижения во все 4 стороны + поднятие и спуск на 1 блок. P.S.2. Это мой первый проект, так что не бомбите от багов и проблем. 03.09.2021 19:50 UPD: Возможно сегодня если приложение будет работать, я выложу всё.
  17. 0 баллов
    наконец я вернулся прост дел много проект скорее всего закрою ибо занимаюсь уже разработкой базы на opencomputers и всеми забытым computronics
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...