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

Krutoy

Гуру
  • Публикации

    482
  • Зарегистрирован

  • Посещение

  • Победитель дней

    72

Сообщения, опубликованные пользователем Krutoy


  1. Обрадовался что на сервере разрешили печатать 3д модели и побежал в одиночку делать всякие прикольные штуковины.

    Но когда зашел на сервер и узнал сколько стоит напечатать, очумел.

     

    Так что не видать мне на сервере принтов.

     

    Но вот что получилось в одиночке:

    Сегодняшняя первая проба - футуристичная дверь из 4х частей:

    nXy62pT.png

     

    А за ней следовали стержни в корпусе:

    uxEEG70.png

     

    Код стержней:

     

     

    {
      label = "Крутые стержни",
      tooltip = "Высокоэнергетическая тлеющая плазма в магнитных удерживающих резервуарах",
      lightLevel = 15,
      emitRedstone = false,
      buttonMode = false,
      shapes = {
        { 1,0,10,15,1,15,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 3,0,9,4,16,10,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 3,0,15,4,16,16,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 5,0,5,6,16,6,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 6,0,3,11,1,8,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 8,0,2,9,16,3,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 8,0,8,9,16,9,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 11,0,5,12,16,6,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 12,0,9,13,16,10,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 12,0,15,13,16,16,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 0,1,12,1,16,13,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 1,1,11,6,15,14,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 2,1,10,5,15,15,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 6,1,4,11,15,7,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 6,1,12,7,16,13,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 7,1,3,10,15,8,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 9,1,12,10,16,13,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 10,1,11,15,15,14,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 11,1,10,14,15,15,texture = "nuclearcontrol:infoPanel/on/2/15", state = nil, tint = 0x44ff44 },
        { 15,1,12,16,16,13,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 1,15,10,6,16,15,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 6,15,3,11,16,8,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
        { 10,15,10,15,16,15,texture = "nuclearcontrol:infoPanel/panelAdvancedSide", state = nil, tint = 0xffffff },
      }
    }

     

     

    • Нравится 5

  2. Зачем выложил код? Если меня разгриферят, то пусть это будет тот кто шарит в ОС, а не нубошкольник.

    Не понимаю, к чему такие глубокие теоретические размышления? У тебя весь NEI под рукой. Как можно загрифить креативщика?

     

     

    А код норм, интерфейс на вид удобный. И похоже функционал достаточный, даже нечего посоветовать.


  3. JXmNltW.png

     

    Ура-ура-ура, наконец то кто то делает сложную, многофункциональную программу, заточенную под удобство пользователей. Как я.

     

    Где я могу получить бесплатные очки и стать крутым пользователем твоего чата?

    Давай я построю маленькую будку напротив банка где будут раздавать очки автоматически?


  4. П.С, А  тем временем уже 8 мая и форум аж трещит уже от 3D моделей для принтера. Не знаю, куда девать декор. Завалили уже полностью. Столько напрогали готовых моделей, что не знаю, какой и выбрать для сервера. :smile44:

    Кое кто на букву «А» запретил, вот и не делаем моделей.


  5. Предлагаю реализовать эту фичу следующим образом:

    Поставить возле банка небольшую будку "КБ Роботы Васи". Внутри будет стоять ассемблер, терминал банка и скамейка.

    Дядя Вася приходит, садится на скамейку и ждет покупателей.

    Далее происходит следующее.

     

    Приходит покупатель, говорит: "Дядь Вась, а дядь Вась? Мне бы робота вот такого, бы. Чтобы тут сундук, тут печка, а сзади ракетница торчала.

    P.S. На стену вешаем прайс:

    * Рекурсивный майнер - 4 ляма

    * Крутая черепаха - 1 лям (при покупке 3 штук - четвертая в подарок)

     

    А можно было бы сделать заранее 100 типовых роботов разных расцветок и продавать их на Базаре. Но базара нет...


  6. Вот и будет тебе работенка, написать такую программку и саму механику сборщика. Как оно там будет брать платы, откуда, какие, как запихивать в ассемблер будет и т.д., думаю придумаешь, это легко. Как там он будет выплывать и т.д.  

     

    А можно вообще сделать фичу! Нажимаешь тип реактора, который нужен,  выбираешь схему укладки урановых стержней, отражателей и поглотителей с охладителями, жмакаешь,  и у тебя дома строится такой реактор. Я за такую фичу в банке! ;)

    Моя школа! Куда лучше чем говорить что "невозможно" и "не нужно".


  7. Sangar год назад писал что так и должно быть и он особо не собирается менять. В IRC подсказали что стоит фильтровать с помощью рандомных подписей к пакетам.

    Нужно еще подумать что делать. Возможно мы сумеем настроить какие то закрытые каналы.


  8. Крутые новости про 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

     

     

    jF8apCz.png

     

     

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

    В будущем планирую сделать получение сообщений из интернет-карты для работы, например IRC клиентов

     

    Набросок будущего интерфейса сервера:

     

     

    I4wu2E9.png

     

     

     

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

    26EBEtn.png

    • Нравится 1
    • Спасибо 1

  9. Не только у меня, на сколько я понял практически у всех после обновление лаунчера пропали:

    1 Пропала точка дома и команда /back

    2 Пропал полностью весь ивент вместе со слотами на бронь.

    3 Очистились полностью все /pv 1..5 и очистились их количества и слоты (пропали апгрейты)

    4 Очистился полностью эндер-сундук.

    ЛОЛ!

    И сейчас еще придет такой Алекс и скажет "Ой, а бекапов нет. Откатить не получится".

    Вот это будет номер!

    • Нравится 1

  10. Если кубик хранить в виде 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}}
    

    И соответственно по индексам мы назначаем цвета в новую таблицу после поворота.

    В моем примере "с" это таблица с данными о сегменте, которая сохраняет значение цвета в каждой из сторон. Конечно, каждый сегмент придется тоже поворачивать.

     

     

    Это первое что пришло в голову. Всё же, я советую поискать, и найти готовые решения на каком то другом языке, и брать примеры оттуда.


  11. 3. Организация доступа к OpenNet через обычную сеть путем установки роутеров в местах проживания игроков.

    5. Служба pastebin для доступа к известному ресурсу в условиях отсутствия интернет-платы

    Хотеть!! Вот это то, чем я бы пользовался.

    Но нужно что бы платы как то выдавались пока тебя нет в сети. Иначе гениальная мысль придет, и нужно будет ждать пока ты в онлайне будешь.

    Еще, добавь пожалуйста в список реализовать функционал всех трех карт в одну (сеть, линк, интернет). То есть купил on-карту (или вставил безпроводную в зоне сети) и у тебя и интернет в придачу.

     

    Но всё равно буду следить за развитием сети. Особенно интересно как будут пользоваться игроки.


  12. После создания таблицы и её обработки - она попадает в кэш. Она может быть там часами, если её не заменит что либо другое. Так что единственный способ исключить это влияние - заполнять таблицу другими данными перед каждым тестом.

    Заполнил

    Сериализовал

    Заполнил

    Разсериализовал

    Посмотри первые 30 строк пруфа где я собственно создаю и сериализую таблицу. Я оставил только 1 сериализацию и замер выдает идентичные результаты, даже при отдельном запуске каждого типа сериализации.


  13. Итак, я провел тесты. Результаты потрясающие - почти мой код сериализует в десятки раз быстрее.

     

    Для двухмерного массива с 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
    

    Пруф для меньшего количества полей:

    http://ideone.com/ICpS0L


  14.  

    Полезно. Но ты сравнивал по производительности с библиотекой OC Serialization API?

    (https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/OpenOS/lib/serialization.lua)

    Нет, не сравнивал, но попробую сравнить позже.

    Быстрым просмотром кода я обнаружил что в ОС тоже используется оператор ".." к общей строке

     

     

    Но ведь там же сплошь и рядом конкатенация. Ты сравнивал по производительности с serialize?

    Производительность не сравнивал, доверился расчетам. Но могу и провести.

    Суть в том, что в моем коде осуществляется конкатенация коротких подстрок. В стандартных же либах СС и ОС производится добавление символов в общую строку, что намного медленнее.


  15. J7TZYgF.png

     

    Для работы крутой черепашки мне потребовалось быстро сериализировать и передавать по сети большие объемы информации. 3д массивы, таблицы, и прочее прочее.

    Внутренние методы СС Textutils.serialize не подходили, из за медленного оператора ".." , который добавлял в итоговую строку символы.

    Поискав готовые решения на сайте lua-users, я нашел подходящий код для сохранения таблиц в файл, и переписал его под работу со строкой.

     

    http://pastebin.com/AYB7u25g

     

    Код:

     

     

    -- ********************************************************************************** --

    -- **   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 

    Пруф для меньшего количества полей:

    http://ideone.com/ICpS0L

    • Нравится 4

  16. Гораздо более рационально делать так:

    2 пастбина.

     

    1 - Центр обновлений

    2 - Программа

    Да, согласен. Это решение было бы менее затратным по траффику.

    Но когда я активно прогаю, делаю примерно по 20 изменений кода в день, поэтому подкручивать 2 файла по отдельности будет труднее.

     

    В любом случае, имея 100мб/с траффик не стоит задумываться о 100кб загрузках.

×
×
  • Создать...