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

Вся активность

Этот поток обновляется автоматически     

  1. Вчера
  2. Вот два инсталятора: Первый парсит странички и получает список файлов: local owner = "AlexCatze" local repo = "RacoonNet" local branch = "v0.2" local internet = require("internet") local fs = require("filesystem") local shell = require("shell") function request(url) local html = "" local result, response = pcall(internet.request, url) if result then local result = pcall(function() for chunk in response do html = html .. chunk end end) end return html end function parse( html,sHead, sTail, fnc) local pTail, pHead = 1 while true do pHead = html:find( sHead, pTail, true ) if not pHead then break end pTail = html:find( sTail, pHead+#sHead, true ) if not pTail then break end fnc( html:sub(pHead+#sHead,pTail-1) ) pTail = pTail+#sTail end end function get_files(url) local result = request(url) if result then parse(result, 'data-pjax="#repo-content-pjax-container" href="', '">', function(s) result = request("https://github.com"..s) os.sleep(0) if result then os.sleep(0) local raw parse(result, '/raw/', '" id="raw-url"', function(s) raw = s end) if raw ~= "" and raw ~= nil then local path = "/"..raw:match("[^/]/(.*)") if not fs.exists(path:match(".*/")) then fs.makeDirectory(path:match(".*/")) end shell.execute("wget -f ".."https://raw.githubusercontent.com/"..owner.."/"..repo.."/"..raw.." "..path) os.sleep(0) else os.sleep(0) get_files("https://github.com"..s) end end end) end end get_files("https://github.com/"..owner.."/"..repo.."/tree/"..branch) У второго же список файлов заранее задан(используя мою утилитку): local shell = require("shell") local fs = require("filesystem") local prefix = "https://raw.githubusercontent.com/AlexCatze/RacoonNet/v0.2" local files = {"/bin/chat.lua","/bin/chat_server.lua","/bin/loader.lua","/bin/mc.lua","/bin/ping.lua","/bin/rnconfig.lua","/bin/routconf.lua","/bin/router.lua","/bin/webserver.lua","/bin/wr.lua","/boot/05_config.lua","/etc/config/mc.cfg","/etc/config/sys.cfg","/etc/lang/en.mc.lang","/etc/lang/ru.mc.lang","/etc/lang/ru.router.lang","/etc/themes/monochrome.thm","/etc/themes/redstone.thm","/etc/themes/standart.thm","/lib/forms.lua","/lib/opennet.lua","/lib/racoon.lua","/lib/racoonnet.lua","/lib/rainbow.lua","/lib/rn_modem.lua","/lib/rn_stem.lua","/lib/rn_tunnel.lua","/lib/stem.lua","/www/index.html","/www/second.html",} for _,v in pairs(files) do if not fs.exists(v:match(".*/")) then fs.makeDirectory(v:match(".*/")) end shell.execute("wget -f "..prefix..v.." "..v) end Оба настроены на скачивание одинаковых файлов. Но первый делает это за семь минут, пятьдесят три секунды, а второй за ноль минут, двенадцать секунд. Результат на лицо. Вывод: первый вариант мало применим. Можно либо использовать второй вариант, либо выносить получение списка файлов за пределы майнкрафта.
  3. Кстати, да. С утра мне это тоже показалось бессмысленным. Нам же не обязательно скачивать и разбирать web-страницу файла. Достаточно разобрать ссылку! И если обнаружена ссылка на файл, то можно сразу скачивать её raw-версию: https://github.com/{AUTHOR}/{REPO}/tree/{BRANCH}/{PATH} https://github.com/{AUTHOR}/{REPO}/blob/{BRANCH}/{PATH}/{NAME} https://raw.githubusercontent.com/{AUTHOR}/{REPO}/{BRANCH}/{PATH}/{NAME} Строки ссылок короткие, поэтому тут можно смело применять шаблоны, не опасаясь TLWY.
  4. Последняя неделя
  5. Как конечную точку я её и использую, а вот с начальной нужно возиться. В теории, можно получение списка файлов , возложить на плечи какого нибудь heroku и pythonanywhere.
  6. Сам разбор работает очень быстро, если использовать find без шаблонов. Медленно работает получение страницы, тратя один такт времени на каждый кусок. А кусков много, Web-версия гораздо объёмнее, нежели API. Очень странный подход у владельца гитхаба – ограничивать быстрый и компактный вариант, не ограничивая медленный. С этим я согласен. Но инсталляция требуется один раз, на эксплуатации программы это никак не скажется. Зато программист может не тратить своё внимание на обновление установщика при каждом изменении. Но я не настаиваю на этом решении. Я могу лишь предлагать. Почему же бессмысленно? Фраза id="raw-url" встречается на странице лишь один раз или не встречается вовсе.
  7. Сейчас попробовал. TLWY нету, но работает это краааайне медленно. Сейчас воюю с парсингом raw ссылки, но что-то мне кажется, что это бессмысленно. Первый вариант, с предварительно заданным списком файлов хоть и требует потратить минуту на задание этого самого списка, но в перспективе работает на пару порядков быстрее.
  8. Кажется понял о чем ты. Нужно дать возможность получать доступ к родительскому объекту. В принципе, этот доступ есть через метатаблицу: getmetatable(self).draw(self) -- вызываем родительский метод Коряво, конечно. Нужно будет подумать над чем-то вроде: self.inherited:draw()
  9. Щас можно написать че-то вроде function Btn1:draw() TButton.draw(self) -- вызываем родительский метод end Насколько я понимаю, с точки зрения семантики это одно и тоже что и отсутствие переопределения В коде выше для переопределения метода у Btn1 нужно знать, экземпляр какого класса является Btn1. Допустим, мы хотим переопределять методы произвольных экземпляров произвольных классов. Че-то вроде function addCallback(formElement, methodName, callback) formElement[methodName] = function(self, ...) baseClass[methodName](self, ...) --где взять значение baseClass, если formElement - экземпляр проивзольного класса формочек? callback(self) end end Если бы self содержал в себе ссылку на базовый класс, это можно было бы решить так: function addCallback(formElement, methodName, callback) formElement[methodName] = function(self, ...) self.super[methodName](self, ...) callback(self) end end
  10. @hohserg, а что должна содержать базовая таблица? Что ты имеешь в виду под "более обобщенным кодом"? Приведи пример, пожалуйста.
  11. А можешь сделать так,чтобы у экземпляров кнопок было поле super, содержащее базовую таблицу? Это бы уменьшило вероятность ошибки и позволило бы писать более обобщенный код(не зависящий от конкретного базового класса)
  12. Тогда я не вижу другого варианта кроме использования find без шаблонов. Код распухнет строк на 10, но, как ни странно, он работает гораздо быстрее библиотечных функций: local sHead, sTail = 'data-pjax="#repo-content-pjax-container" href="', '">' local pTail, pHead = 1 while true do pHead = html:find( sHead, pTail, true ) if not pHead then break end pTail = html:find( sTail, pHead+#sHead, true ) if not pTail then break end print( html:sub(pHead+#sHead,pTail-1) ) pTail = pTail+#sTail end На моём компьютере этот код можно выполнить примерно 1-1.5 тысячи раз до наступления TLWY, запас огромный.
  13. Да, немного я погорячился с "неограниченным" количеством. epoll тоже имеет ограничение, указанное в /proc/sys/fs/epoll/max_user_watches pi@raspberrypi:~ $ cat /proc/sys/fs/epoll/max_user_watches 269947 Но я думаю, что условно-неограниченным можно считать, пока не нужно создавать промежуточный сервер - вот там могут быть проблемы при большой нагрузке.
  14. @AlexCatze, не могу представить зачем нужно событие перерисовки элемента. Ну допустим, я хочу просто посчитать сколько раз была отрисована та или иная кнопка. Лучше сделать это не влезая в метод TComponent:draw, поскольку TComponent:draw вызывается абсолютно для всех компонентов, а меня интересует только одна кнопка. Это делается при помощи магии ООП, называемой полиморфизм. Вот пример кода: Btn1=Form1:addButton(65,21,"Кнопка") -- создаем кнопку Cnt1=Form1:addLabel(10,5,0) -- создадим метку со счетчиком событий function Btn1.onDraw() -- определяем событие onDraw для кнопки Btn1, Cnt1.caption=Cnt1.caption+1 -- которое увеличивает счетчик Cnt1:redraw() -- и перерисовывает метку end function Btn1:draw() -- переопределяем метод draw для кнопки Btn1, в котором TButton.draw(self) -- вызываем родительский метод if self.onDraw then self.onDraw() end -- и если надо, обработчик события onDraw end В этом случае выполнять проверку if self.onDraw не обязательно, поскольку переопределенный метод draw работает только для кнопки Btn1. А метод TComponent:draw остается без изменений. Но поковыряться в библиотеке forms таки придется. Дело в том, что объект TButton является локальным и недоступен во внешних модулях. Просто убери слово local в этой строке: ------------------Button---------------- local TButton=setmetatable({W=10, H=1, color=0x606060, type=function() return "Button" end},TComponent)
  15. Тут подробнее. Я на днях смотрел java nio, селекторы используются в зависимости от SelectorProvider, на линухе по дефолту используется EpollSelector, у него лимит куда больше.
  16. Попробовал, веб в версии отрабатывает, а в локальной всё тот же TLWY.
  17. @AlexCatze Предлагаю вместо этой конструкции: html:gsub( 'data%-pjax="#repo%-content%-pjax%-container" href="(.-)">', function(s)os.sleep(0)print(s)end ) использовать такую: for s in html:gmatch( 'data%-pjax="#repo%-content%-pjax%-container" href="(.-)">')do os.sleep(0)print(s)end Работает раза в два быстрее. Web-версия оцелота успешно отработала этот код.
  18. Возможно. В любом случае, на нормальном майне смогу проверить только в понедельник.
  19. У меня аналогичный опыт. Но это очень странно. Веб-версия оцелота отработала до истечения таймаута на два порядка больше итераций пустого цикла, чем в игре на моём компьютере. Зато при обработке gsub почему-то валится в TLWY. Может, Ocelot кривоват?
  20. @AlexCatze Похоже, на этом железе и на таком объёме данных gsub не успевает выполнить даже одну итерацию за отпущенный ему таймаут. Жаль. Придётся использовать более сложные способа разбора.
  21. Да, верно. А хоть что-нибудь успевает распарситься?
  22. Так? local url = "https://github.com/AlexCatze/racoon-dev/" local internet = require("internet") local html = "" local result, response = pcall(internet.request, url) if result then local result = pcall(function() for chunk in response do html = html .. chunk end end) end if result then html:gsub( 'data%-pjax="#repo%-content%-pjax%-container" href="(.-)">', function(s) os.sleep(0) print(s)end ) end Только что попробовал, эффект тот же.
  23. Проверил у себя на компьютере, gsub в моём примере выполнился за 2.5 сек. А стандартный таймаут для TLWY составляет 5 сек. Запас по времени маловат, поэтому решение неустойчивое, на слабом железе работать не будет. Предлагаю в вызываемую функцию добавить os.sleep(0).
  24. Очередной никому не нужный мост Библиотека для Kotlin/Java/Pythonскоро (я не уверен, что он вообще будет) с клиентом OpenComputers для интеграции в ваше приложение. Мост нестандартный. Потому что может это всё: Выполнение существующих функций на удаленном устройстве OpenComputers (без компиляции, быстрый способ) Выполнение произвольного кода на удаленном устройстве OpenComputers (с компиляцией, медленный способ) Можно комбинировать выполнение функций и кода в одном запросе, передавая в аргументы результаты предыдущих выполнений. Получение ивентов с фильтром (например, по умолчанию игнорируются множество ивентов пользовательского ввода) Возможность отправки любых сообщений через протокол из, например, event.listen (что крайне не рекомендуется, но возможность есть) Соединение с клиентом будет разорвано автоматически максимум через 10 секунд, если компьютер перестал функционировать (например, выгрузился чанк или отключился сервер), а соединение не разорвалось. И все это с условно-неограниченным количеством подключенных клиентов - лишь бы хватило ОЗУ, производительности ЦПУ и ОС хоста поддерживала что-то получше select (у него есть ограничение в 1024 сокета). Так же поддерживается аутентификация, но не поддерживается шифрование. Оно было бы возможно (в простом варианте без кучи кода и криптографии), если бы мод поддерживал вебсокеты, но пока такая возможность отсутствует. Основная цель - хранение кода подальше от опенкомпов, желательно у себя дома. Так же вы всегда знаете, подключен ли компьютер или нет. Минусы: Требуется статический белый айпи (хотя для написания промежуточного сервера нужно переписать минимум кода благодаря использованию селекторов, я пока не стал этого делать) Из-за того, что изначально OpenComputers не имеет кода для выполнения, немного снижена производительность. Присутствует Javadoc. Пример кода на стороне сервера (Kotlin) Более полный пример (тоже котлин) Репозиторий - в README есть описание работы, а в самом репозитории готовый клиент на moonscript. Да-да, я знаю, что в Lua нет компиляции, но судя по скорости это именно она и происходит.
  25. Попробовал на эмуляторе ocelot, получил TLWY. Видимо ответ слишком большой для gsub.
  1. Загрузить больше активности
×
×
  • Создать...