Krutoy
-
Публикации
482 -
Зарегистрирован
-
Посещение
-
Победитель дней
72
Сообщения, опубликованные пользователем Krutoy
-
-
Зачем выложил код? Если меня разгриферят, то пусть это будет тот кто шарит в ОС, а не нубошкольник.
Не понимаю, к чему такие глубокие теоретические размышления? У тебя весь NEI под рукой. Как можно загрифить креативщика?
А код норм, интерфейс на вид удобный. И похоже функционал достаточный, даже нечего посоветовать.
-

Ура-ура-ура, наконец то кто то делает сложную, многофункциональную программу, заточенную под удобство пользователей. Как я.
Где я могу получить бесплатные очки и стать крутым пользователем твоего чата?
Давай я построю маленькую будку напротив банка где будут раздавать очки автоматически?
-
П.С, А тем временем уже 8 мая и форум аж трещит уже от 3D моделей для принтера. Не знаю, куда девать декор. Завалили уже полностью. Столько напрогали готовых моделей, что не знаю, какой и выбрать для сервера.

Кое кто на букву «А» запретил, вот и не делаем моделей.
-
Предлагаю реализовать эту фичу следующим образом:
Поставить возле банка небольшую будку "КБ Роботы Васи". Внутри будет стоять ассемблер, терминал банка и скамейка.
Дядя Вася приходит, садится на скамейку и ждет покупателей.
Далее происходит следующее.
Приходит покупатель, говорит: "Дядь Вась, а дядь Вась? Мне бы робота вот такого, бы. Чтобы тут сундук, тут печка, а сзади ракетница торчала.
P.S. На стену вешаем прайс:
* Рекурсивный майнер - 4 ляма
* Крутая черепаха - 1 лям (при покупке 3 штук - четвертая в подарок)
А можно было бы сделать заранее 100 типовых роботов разных расцветок и продавать их на Базаре. Но базара нет...
-
Вот и будет тебе работенка, написать такую программку и саму механику сборщика. Как оно там будет брать платы, откуда, какие, как запихивать в ассемблер будет и т.д., думаю придумаешь, это легко. Как там он будет выплывать и т.д.
А можно вообще сделать фичу! Нажимаешь тип реактора, который нужен, выбираешь схему укладки урановых стержней, отражателей и поглотителей с охладителями, жмакаешь, и у тебя дома строится такой реактор. Я за такую фичу в банке!

Моя школа! Куда лучше чем говорить что "невозможно" и "не нужно".
-
Sangar год назад писал что так и должно быть и он особо не собирается менять. В IRC подсказали что стоит фильтровать с помощью рандомных подписей к пакетам.
Нужно еще подумать что делать. Возможно мы сумеем настроить какие то закрытые каналы.
-
Крутые новости про opennet!
■ Мы создали облачный проект.
Теперь за всеми изменениями вы можете наблюдать там, а так же смотреть как изменяется и улучшается код, пополняясь новыми файлами и классами.
https://ide.c9.io/krutoy242/opennet
■ Команда проекта увеличилась и появились первые пользователи.
На данный момент сеть разрабатывают Zer0Galaxy, Totoro и Krutoy.
Из пользователей - Asummonster и Trojan4ik, которые помогают найти ошибки в сети, которые раньше были не заметны.
А сейчас, пока Зеро занят IRL и opennet сервер непонятно почему повторяет сообщения аж четыре раза, расскажу как работает моя часть кода.
Внимание! Пока сеть только тестируется, и не все функции работают.
Сервер обновлений
Эта машина упрощает установку ПО для работы opennet. Например, для работы интернет-сервера нужно 4 файла и качать их в ручную было бы напряжно.
Работа сервера обновлений позволяет вписать всего 1 строку в lua на чистой машине, которая сама подключится к серверу и получит все необходимые файлы.
Но это не всё:
- При использовании opennet, этот сервер будет посылать новые версии ПО, если это необходимо. То есть, после первой установки вам не придется в ручную обновлять ПО, если выйдут критические изменения.
- Вместе с ПО для opennet у нас появится возможность добавлять пользовательские приложения. Например, Asummonster пишет чатик вроде аськи, Totoro с Зеро делают браузер и web-сервер. И для установки всего этого вам нужно будет всего один раз запустить установку.
Интернет сервер
Все пользователи opennet получают доступ к интернету, даже есть у них нет интернет-карты! Причем для этого не нужно будет что то делать - код создает виртуальную интернет-карту, она появляется в списке компонентов, и к ней можно обращаться как к настоящей карте. Например, без проблем работают программы wget и pastebin

На самом сервере стоит программное обеспечение, которое обрабатывает запросы и сохраняет открытые соединения в таблицу. Принимая сообщение, сервер перенаправляет его на свою настоящую интернет-карту, получает ответ и отправляет его запрашивающему. Интересно, что если функция, например internet.request() возвращает итератор, то итератор и будет возвращен клиенту.
В будущем планирую сделать получение сообщений из интернет-карты для работы, например IRC клиентов
Набросок будущего интерфейса сервера:

Скриншот небольшого компьютерного клуба, в котором и проходит тестирование сети:

-
1
-
1
-
Не только у меня, на сколько я понял практически у всех после обновление лаунчера пропали:
1 Пропала точка дома и команда /back
2 Пропал полностью весь ивент вместе со слотами на бронь.
3 Очистились полностью все /pv 1..5 и очистились их количества и слоты (пропали апгрейты)
4 Очистился полностью эндер-сундук.
ЛОЛ!
И сейчас еще придет такой Алекс и скажет "Ой, а бекапов нет. Откатить не получится".
Вот это будет номер!
-
1
-
-
Я уже если честно начал путаться. Задача сложная математически, и мне не хватает ума что бы помочь тебе.
-
Вот мой нубокод: http://pastebin.com/XFxXRKUu, с правилами в таблице будет короче, но принцип точно такой же.
Да, действительно китайский код =)
-
А что там мама нажарила? Аж интересно стало?

Видимо что то грубое и непристойное.
-
1
-
-

Кое кто явно перемудрил с фильтрами.
-
-
Если кубик хранить в виде 3х массивов (срез по высоте), то вращение в одну сторону можно было бы сделать вставлением конца в начало:
-- Наш массив первого среза кубика local s = {[0] = с, с, [...], с} -- Берем последние 2 числа из массива -- и вставляем их в начало. Все остальные индексы переписываются for i=1,2 do table.insert(s, 1, table.remove(s)) endАналогично можно сделать и вращение в другую сторону, удаляя элементы с начала и вставляя их в конец.
А вот с вращением боковых сторон нужно делать по правилам как ты и написал. Но при этом можно использовать функцию что я указал выше.
Например, передняя сторона куба записанна как:
{{1,c},{1,c},{1,c},{2,c},{2,c},{2,c},{3,c},{3,c}}После поворота она будет выглядеть так:
{{1,c},{2,c},{3,c},{3,c},{3,c},{2,c},{1,c},{1,c}}И соответственно по индексам мы назначаем цвета в новую таблицу после поворота.
В моем примере "с" это таблица с данными о сегменте, которая сохраняет значение цвета в каждой из сторон. Конечно, каждый сегмент придется тоже поворачивать.
Это первое что пришло в голову. Всё же, я советую поискать, и найти готовые решения на каком то другом языке, и брать примеры оттуда.
-
Совершенно верно. Только есть проблемка - они не стакаются
У робота может быть 48 слотов если не ошибаюсь. 48 карт будешь век продавать, если выдавать по 1-3 на руки.
-
Да в чем проблема. Поставьте раздатчик в первую кабинку или робота, в нее засуньте этих карт. В банке кнопочку нажал - деньги снялись, редстоун сигнал и раздатчик или робот кинул 1 штучку.
-
3. Организация доступа к OpenNet через обычную сеть путем установки роутеров в местах проживания игроков.
5. Служба pastebin для доступа к известному ресурсу в условиях отсутствия интернет-платы
Хотеть!! Вот это то, чем я бы пользовался.
Но нужно что бы платы как то выдавались пока тебя нет в сети. Иначе гениальная мысль придет, и нужно будет ждать пока ты в онлайне будешь.
Еще, добавь пожалуйста в список реализовать функционал всех трех карт в одну (сеть, линк, интернет). То есть купил on-карту (или вставил безпроводную в зоне сети) и у тебя и интернет в придачу.
Но всё равно буду следить за развитием сети. Особенно интересно как будут пользоваться игроки.
-
После создания таблицы и её обработки - она попадает в кэш. Она может быть там часами, если её не заменит что либо другое. Так что единственный способ исключить это влияние - заполнять таблицу другими данными перед каждым тестом.
Заполнил
Сериализовал
Заполнил
Разсериализовал
Посмотри первые 30 строк пруфа где я собственно создаю и сериализую таблицу. Я оставил только 1 сериализацию и замер выдает идентичные результаты, даже при отдельном запуске каждого типа сериализации.
-
Не забываем про КЭШ, он сильно искажает показатели тестов, поэтому его надо очищат
Нет Рид, не в этом случае. Если запускать отдельно каждую функцию результат идентичный.
Пруф для 100 000: http://ideone.com/JZODo2
-
Итак, я провел тесты. Результаты потрясающие - почти мой код сериализует в десятки раз быстрее.
Для двухмерного массива с 1 000 000 полей замеры времени выполнения:
//CC textutils serialize(): 45.94 unserialize(): 1.73 //OC serialization serialization.serialize(): 40.00 serialization.unserialize(): 0.87 //Krutoy table.tostring: table.toString(): 1.80 table.fromString(): 1.19
Пруф для меньшего количества полей:
-
Полезно. Но ты сравнивал по производительности с библиотекой OC Serialization API?
Нет, не сравнивал, но попробую сравнить позже.
Быстрым просмотром кода я обнаружил что в ОС тоже используется оператор ".." к общей строке
Но ведь там же сплошь и рядом конкатенация. Ты сравнивал по производительности с serialize?
Производительность не сравнивал, доверился расчетам. Но могу и провести.
Суть в том, что в моем коде осуществляется конкатенация коротких подстрок. В стандартных же либах СС и ОС производится добавление символов в общую строку, что намного медленнее.
-

Для работы крутой черепашки мне потребовалось быстро сериализировать и передавать по сети большие объемы информации. 3д массивы, таблицы, и прочее прочее.
Внутренние методы СС Textutils.serialize не подходили, из за медленного оператора ".." , который добавлял в итоговую строку символы.
Поискав готовые решения на сайте lua-users, я нашел подходящий код для сохранения таблиц в файл, и переписал его под работу со строкой.
Код:
-- ********************************************************************************** --
-- ** Serialize table to string ** --
-- ** ** --
-- ** Modified version of http://lua-users.org/wiki/SaveTableToFile ** --
-- ** By Krutoy242 ** --
-- ********************************************************************************** --
-- declare local variables
--// exportstring( string )
--// returns a "Lua" portable version of the string
local function exportstring( s )
return string.format("%q", s)
end
local insert = table.insert
local tostring= tostring
local ipairs = ipairs
local pairs = pairs
local type = type
--// The Save Function
function table.toString(tbl)
if type(tbl) ~= 'table' then return "" end -- Argument not a table
local charS,charE = " ","\n"
local s_tbl = {}
-- initiate variables for save procedure
local tables,lookup = { tbl },{ [tbl] = 1 }
insert(s_tbl, "return {"..charE )
for idx,t in ipairs( tables ) do
insert(s_tbl, "-- Table: {"..idx.."}"..charE )
insert(s_tbl, "{"..charE )
local thandled = {}
for i,v in ipairs( t ) do
thandled = true
local stype = type( v )
-- only handle value
if stype == "table" then
if not lookup[v] then
insert( tables, v )
lookup[v] = #tables
end
insert(s_tbl, charS.."{"..lookup[v].."},"..charE )
elseif stype == "string" then
insert(s_tbl, charS..exportstring( v )..","..charE )
elseif stype == "number" or stype == "boolean" then
insert(s_tbl, charS..tostring( v )..","..charE )
end
end
for i,v in pairs( t ) do
-- escape handled values
if (not thandled) then
local str = ""
local stype = type( i )
-- handle index
if stype == "table" then
if not lookup then
insert( tables,i )
lookup = #tables
end
str = charS.."[{"..lookup.."}]="
elseif stype == "string" then
str = charS.."["..exportstring( i )..]="
elseif stype == "number" or stype == "boolean" then
str = charS.."["..tostring( i )..]="
end
if str ~= "" then
stype = type( v )
-- handle value
if stype == "table" then
if not lookup[v] then
insert( tables,v )
lookup[v] = #tables
end
insert(s_tbl, str.."{"..lookup[v].."},"..charE )
elseif stype == "string" then
insert(s_tbl, str..exportstring( v )..","..charE )
elseif stype == "number" or stype == "boolean" then
insert(s_tbl, str..tostring( v )..","..charE )
end
end
end
end
insert(s_tbl, "},"..charE )
end
insert(s_tbl, "}" )
return table.concat(s_tbl)
end
--// The Load Function
function table.fromString(s)
if not s then return end -- Argument not string
local ftables = loadstring(s)
if not ftables then return end -- String cant be parsed into function
local tables = ftables()
for idx = 1,#tables do
local tolinki = {}
for i,v in pairs( tables[idx] ) do
if type( v ) == "table" then
tables[idx] = tables[v[1]]
end
if type( i ) == "table" and tables[i[1]] then
insert( tolinki,{ i,tables[i[1]] } )
end
end
-- link indices
for _,v in ipairs( tolinki ) do
tables[idx][v[2]],tables[idx][v[1]] = tables[idx][v[1]],nil
end
end
return tables[1]
end
- Userdata, Функции и метотаблицы не сохраняются
- Сохраняются только простые значения как таблицы, строки, числа а так же true\false
Замечу, что в моем коде для сбора строки используется таблица и метод table.concat(), который увеличивает скорость работы в разы.
Код можно использовать как в CС так и в OС. Он добавляет новые методы в глобальную таблицу table и вызывается так:
-- Таблица, которую мы превращаем в строку
local obj = {[0]=1, 2, 3, ["fieldName"]=0, {6,7,8}}
-- Сериализация
local s = table.toString(obj)
-- Обратно из строки в таблицу
local _obj = table.fromString(s)Результаты для двухмерного массива с 1 000 000 полей и замеры времени выполнения:
//CC textutils serialize(): 45.94 unserialize(): 1.73 //OC serialization serialization.serialize(): 40.00 serialization.unserialize(): 0.87 //Krutoy table.tostring: table.toString(): 1.80 table.fromString(): 1.19
Пруф для меньшего количества полей:
-
4
-
Гораздо более рационально делать так:
2 пастбина.
1 - Центр обновлений
2 - Программа
Да, согласен. Это решение было бы менее затратным по траффику.
Но когда я активно прогаю, делаю примерно по 20 изменений кода в день, поэтому подкручивать 2 файла по отдельности будет труднее.
В любом случае, имея 100мб/с траффик не стоит задумываться о 100кб загрузках.
-
Ух ты, а идея с такими дверьми прикольная, мне нравится. Блин, принтер вообще офигенен.


Печатаем декор!
в Инфраструктура
Опубликовано:
Обрадовался что на сервере разрешили печатать 3д модели и побежал в одиночку делать всякие прикольные штуковины.
Но когда зашел на сервер и узнал сколько стоит напечатать, очумел.
Так что не видать мне на сервере принтов.
Но вот что получилось в одиночке:
Сегодняшняя первая проба - футуристичная дверь из 4х частей:
А за ней следовали стержни в корпусе:
Код стержней: