1Ridav
-
Публикации
218 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем 1Ridav
-
-
Хм, почему то у меня крашится приложение при попытке что-либо отправить (в приложении "rc" произошла ошибка). Android 4.1.1
Приложение больше не соответствует методам работы моста. Допиливаю новое приложение ТЫК
-
Изменил библиотеку, адаптировал к новым алгоритмам работы моста. Исправил несколько серьезных багов.
Мост работает по адресу bridge.computercraft.ru .Система уже доступна для полноценного использования, допиливаю лишь детали в андроид приложении
-
UPD: прироста скорости не заметил вовсе. Если она и возросла, то визуально это не подтвердилось.Реальный прирост лишь во время длительной обработки циклами
-
Давно хотел заняться вводом цветов в редактор, но и так загружен несколькими задумками. Не совсем понял для чего использовать библиотеку отдельно, на мой взгляд будет удобнее сделать копию оригинального редактора и дополнить уже его. Нецензурные словечки в коде напрягают
. Скорость прорисовки надо будет еще допиливать, хотя не уверен, что сильно возрастетPS: В циклах используй кеширование функций для unicode.find, получишь прирост скорости на 20% минимум
for i = 1, 1000 do math.sin(i) end работает на 30% медленее, чем local sin = math.sin //кеширование функции for i = 1, 1000 do sin(i) end
-
2
-
-
Ухты, то-есть не обязательно иметь over 9999+ сообщений на форуме? Можно и мне тоже?
ktlo@computercraft.ru зареригстрирован, первичный пароль отправил в ЛС
-
А мне можно?

cloud@computercraft.ru зарегистрирован, первичный пароль отослал в ЛС
-
На счет буферизации изображений на экране. В свободное время сделаю библу-прослойку для буферизации изображений, в графических интерфейсах будет значительный прирост производительности. Работать будет так же как и обычный gpu.set и аналогичные функции видеокарты. Дополнится лишь функцией - flush()
-
Единственный минус - обновление всего экрана вместо отдельных элементов. Тут нужна буферизация, но это очень проблематичное занятие, хотя имеет огромную пользу. Скачал исходники, в свободное время подробно изучу
PS:write(chunk) cyka = cyka .. chunk
Просто убило наповал
Некоторые библиотеки для этой ОС как оказалось взяты с нашего портала
Так что полезным делом занимаемся, товарищиhttps://github.com/IgorTimofeev/OpenComputers/blob/master/lib/qrcode.lua
https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/thread.lua
-
local file=fs.open(sfile..".ltx","a") добавляет новую строку, но не заменяет существующие
-
функции старайся кешировать.
local select = r.select
local turnRight = r.turnRight
а затем вызывай напрямую select() turnRight() и тд.
Связанно это с особенностями работы Lua, таким образом уберешь лишние операции
-
2
-
-
Из консоли работать с картами особого смысла не имеет, нужна возможность встраивать твою программу в другие программы в виде библиотеки
-
1
-
-
Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация.
Плюсы по сравнению с оригиналом:
1. Объектный подход
2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице
3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные
--by 1Ridav, rewritten by FredoNook ---http://computercraft.ru local PWD = os.getenv("PWD") local pref = {} local meta = {} meta.filename = "" meta.table = {} local function load(path) local table = {} local key, value, delimeter local len = 0 local f = io.open(path, "r") if not f then return nil end for line in f:lines() do len = len + 1 delimeter = string.find(line, "=") key = string.sub(line, 1, delimeter-1) value = string.sub(line, delimeter+1, #line) table[key] = value end f:close() if len == 0 then return nil end return table end function meta.__call(op, path) local newmeta = {} for n, v in pairs(meta) do newmeta[n] = v end local table = load(PWD..path) or {} newmeta.table = table newmeta.filename = PWD..path newmeta.__index = newmeta setmetatable(table, newmeta) return table end function meta:save() local f = io.open(self.filename, "w") if not f then return false end for k, v in pairs(self.table) do f:write(k.."="..v.."\n") end f:close() return true end setmetatable(pref, meta) return prefИспользование:
preferences = pref("filepath")В случае если файл найден открывает его и парсит в переменную preferences, в случае если файл отсутствует создает новую таблицу в preferences.
preferences:save()
Сохраняет таблицу в файл (по пути который был задан в pref("filename"))
Пример:
pref = require("pref") // подключаем либу settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица settings.fname = "Bob" -- Добавляем значения к таблице settings.lname = "Marley" settings.year = 90 settings.status = "Narcoman" settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории settings.year = 00 -- Меняем значения в загруженной таблице settings.status = "Icon" settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директорииPS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome.
Я тоже по началу такой путь выбрал. но потом пока дебажил - вечно путался где у меня префы, а где свои переменные. Сказалось то, что всегда работал с ними через get/set вызовы функций типа set("key", value). Поэтому решил для наглядности использовать табличный вид, они контрастно выделяются на фоне. В принципе большой разницы нет в моем или твоем варианте, это лишь дело вкуса при использовании
PS: Поднял твое сообщение, чтобы было видно всем
-
Тоже занимался таким же вопросом на гуи библе для СС, пришлось написать свою реализацию на ивентах.
-
Хм, яндекс почта

А вы оказывается используете динамический DNS http://pdd.yandex.ru
Сам лично использовал их DNS. Шустрая и юзабельная.
Хотя если IP динамический (как у меня), то сайтец порой бывает в оффлайне пока кеширующие сервера обновят A-записи.
Ну да ладно много болтовни, если можно мне тоже ящичек?

Отделю оповещения с сайта на него, а то в основном все завалено не разберешься сразу кто что прислал.
tuxshot@computercraft.ru Зарегистрирован, первичный пароль скинул в ЛС
-
Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера
В примере описано все очень просто.
Библиотека основана на проходной логике, то есть необходимо иметь цикл, который постоянно крутится, лучше всего для этого подходит главный цикл.
Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что
if msg == nil then
br.init("КЛЮЧ")
Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам
-
https://github.com/1Ridav/Bridge-OpenComputers/blob/master/bridgeLIB.lua
мобильное приложение
Система работает по принципу
Мобильное приложение соединяется с мостом и передает ключ
Клиентская часть OC соединяется с мостом и передает ключ
Мост найдя два одинаковых ключа начнет ретранслировать сообщения от мобильного приложения к ОС, так и от ОС к мобильному приложению.

Подключать приложение и ОС к мосту можно в любом порядке очереди, активность соединения поддерживается самостоятельно. При обрыве соединения OC с мостом, в ОС требуется использовать init(КЛЮЧ)
Функцииinit("стринг ключ", "HOST/IP:PORT"):true/false вводный аргумент ключ соединения, возвращает true/false успешно ли соединение, используется для того, чтобы подключиться к мосту с заданным ключом send("стринг"):true/false вводный аргумент сообщение для пересылки, возвращает true/false успешности отсылания на мост receive():string/nil:true/false --НЕ БЛОКИРУЕТ программу первый аргумент сообщение message, оно может принимать значения: "" пустышки при отсутствии сообщений, nil при потере соединения с мостом Второй аргумент указывает на то, есть ли соединение с мобильным устройством true/false isBridgeConnected():true/false Проверка соединения с мостом isPairConnected():true/false Проверка соединения с мобильным устройством split("стринг", "разделитель"):table -- легкий способ разделить ваши сообщения по разделителям. sendToast("стринг", 0/1) --Дает команду андроиду показать тост, второй аргумент указывает продолжительность. 0 короткий 1 длинный sendNotification(table) -- Дает команду андроиду показать push нотификацию, функция получает таблицу с параметрами К примеру: local notif = {} -- Создали таблицу notif["title"] = "Заголовок" --Обязательный параметр notif["text"] = "Текст нотификации" --Обязательный параметр --Далее идут опциональные параметры, которые расширят ваши возможности оповещения пользователя: notif["blinkTitle"] = "Первичный показывающийся заголовок" -- Показывает этот текст проносящейся строкой notif["id"] = "2" --Айди нотификации, можно использовать айди от 2, тк 1 зарезервирован приложением для собственных нужд --Айди позволяет создавать независимые друг от друга нотификации, иначе они будут наслаиваться друг на друга. --К примеру отослали 3 нотификации с одним айди - они все запишутся поверх, так что пользователь увидит лишь последнюю --Айди так же позволяют исправлять/обновлять предыдущую нотификацию с этим же айди, если она не была прочтена пользователем notif["vibrate"] = true -- Включать ли вибрацию при появлении нотификации. Можно не передавать этот параметр notif["sound"] = true -- Включать ли звук при появлении нотификации. Можно не передавать этот параметр notif["urgent"] = true -- Короткий аналог vibrate&sound, включает звук и вибрацию при появлении нотификацииПример использования: local br = dofile("bridge.lua") local KEY = "q1w2e3r4t5" local msg, pair while true do --Это главный цикл вашей программы msg, pair = br.receive() --НЕ БЛОКИРУЕТ ПРОГРАММУ if msg == nil then --соединение с мостом оборвано или отсутствует br.init(KEY) -- вернет true/false, но мы не проверяем, а просто пропускаем ход elseif msg == "" then --соединение активно, но сообщения для нас нет --ничего не делаем else --сообщение к нам пришло, принтим print(msg) local msgArray = br.split(msg, " ") --разделили наше сообщение по знакам пробела. if(msgArray[1] == "notify") then --если андроид прислал notify строку local notif = {} notif["blinkTitle"] = "Мигающий заголовок" notif["title"] = "Заголовок" notif["text"] = "Текст нотификации" notif["id"] = 2 notif["urgent"] = true br.sendNotification(notif) elseif(msgArray[1] == "toast") --если андроид прислал toast строку br.sendToast("текст всплывающего тоста", 1) -- второй аргумент не обязателен, указывает продолжительность 0 или 1 else br.send("Получено: " .. msg) end end os.sleep(0.5) endБиблиотека на своем уровне обрабатывает следующие сервисные коды, они не видны в возвратных данных receive:
00 - PING
01 - PONG
02 - BRIDGE SHUTDOWN03 - INIT OK
10 - FAILED TO TRANSMIT
20 - PAIR FOUND
21 - PAIR LOST
Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера
В примере описано все очень просто.
Библиотека основана на проходной логике, то есть необходимо иметь цикл, который постоянно крутится, лучше всего для этого подходит главный цикл.
Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что
if msg == nil then
br.init("КЛЮЧ")
Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам
PS:
Если отсылать сообщения при помощи send при том, что receive вернула false вторым аргументом - мост будет отвечать сервисным сообщением 10, которое обрабатывается на уровне библиотеки и невидимо для вас. Таким образом вы нечаянно можете спровоцировать спам сообщениями, которые не дойдут до мобильного приложения, которое фактически не подключено к вам по ключуОбновление 1:
Оптимизирована буферизация и обработка команд, уменьшена возможная задержка между обработкой строк пользователя
-
6
-
-
Мне скорее всего еще рановато, так ведь?
unknown@computercraft.ru Зарегистрирован, первичный пароль выслал в ЛС
В очередь

sergomarov@computercraft.ru Зарегистрирован, первичный пароль отправил в ЛС
-
Как вы думаете, такие старожилы проекта как я и @Asummonster достойны крутого почтового ящика? Мне бы не плохо получить таковой, а то хожу как дурак с гугловским ящиком.
Кстати, скоро увидите мой новый проект.leshainc@computercraft.ru Зарегистрирован, первичный пароль выслал в ЛС
Я бы хотел получить. Я достоен почтового ящика на моём любимом форуме?

assumonster@computercraft.ru Зарегистрирован, первичный пароль отправил в ЛС
-
3
-
-
Такое происходит из-за биндинга, есть разница между статичным и динамичным.
-
В Банке на 2 этажа ниже, под менялой Байтом, поставили такое вот табло.
Оно обогатит тех, кто знает, как использовать QR

Код меняется каждые 20-24 часов, на скрине виден 25-й код, следующим будет 24-й

-
8
-
-
Доброго времени суток.
В одном из своих проектов понадобилось перебрасывать строку с ОС на телефон/планшет. Решил использовать популярный в данный момент QR код, который используется в основном для быстрого перехода на нужную ссылку. В сети нашел код генератора QR, адаптировал его для ОС
В итоге получилась такая вот библиотека: http://pastebin.com/Cgf1x9G1
Использование очень простое:
local qr = dofile("qr.lua") local data = qr.encode("Любая строка, даже кирилица и спецсимволы") -- data будет содержать матрицу из 0 и 1, где 0 это белый, а 1 черный соответственно, хотя цвета можете менять на свой вкус qr.printHalf(data)-- функция быстрого принта, её переделаю исходя из ваших нужд и пожеланий --В любом случае, вы можете и в ручную отрисовать картинку используя матрицу data --для этого просто проходите циклом по ней построчно


-
12
-
-
Прекрасный аргумент против "Как только свиньи научатся летать"!
-
1
-
-
Мой вариант графического фреймворка для СС, может поможет в чем либо.
-
2
-
-
Продолжаю работать над системой, добавил возможность кидать Тосты и Push нотификации, со звуком. Все это можно делать из ОС просто скинув определенную команду с аргументами
Работаю над возможностью строить свое GUI через ОС. Разработчик программы на ОС сможет самостоятельно строить GUI интерфейс на любом андроид устройстве.GUI будет работать как макросы
-
2
-

Android & OpenComputers
в За пределами Minecraft
Опубликовано:
Выложил вторую версию приложения. Разбираюсь с интерфейсом и добавлением возможности полного контроля за соединением.
Ссылка