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

eu_tomat

Модераторы
  • Публикации

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

  • Посещение

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

    331

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


  1. а у меня не Linux у меня Windows

    Это ни коим образом не влияет на работоспособность вирусов для OpenComputers.

    Просто кому-то хотелось поговорить, у кого какая система, от чего одиноко, и решает ли вайн проблему одиночества.


  2. Чё вы так все, я вообще не для OpenComputers. Я просто хочу сделать луа скрипт который бы синкал время мск, и выставлял дату в винде

    Пфхахаха! Действительно, а что это мы. Нам лишь бы про Lua, да OpenComputers флудить. Да еще и про ComputerCraft иногда.

     

    Для выставления времени в винде не нужен скрипт. Находишь в интернете какой-нибудь NTP-сервер, да прописываешь его в настройках. Да и наверняка какой-нибудь time.windows.com уже прописан, осталось только галочку поставить для синхронизации.


  3. В детском майнкрафте сложно представить ситуацию, где требуется супер точное астрономическое время вплоть до иоктосекунд, а также высокая частота его получения.

    Представить сложно, но ТС хочет получить (цитата) "реальное московское время", не уточнив, правда, насколько оно должно быть близким к реальному.

     

    Одного игрока устроит погрешность и в одну-две минуты, а какой-то маньяк будет пытаться довести ее до хотя бы 200ms. Это первый нюанс, создающий почву для дискуссии о методах получения времени и создаваемой при этом нагрузки.

     

    Второй нюанс в том, что игровые сервера бывают разные, и на каких-то из них ход часов может быть пущен на самотек, вынуждая игроков обращаться к внешним серверам и писать своё подобие ntpd. Если при этом серверное время еще иногда и корректируется рывками, то тут остаётся лишь постоянно долбить внешние сервера, пока те не забанят. Или придется снизить требования точности.

     

    Мне кажется, для часиков там достаточно при старте (и потом где-нибудь раз в час) синхронизировать состояние. А потом просто слипами отсчитывать секунды / минуты. Минимум нагрузки, приемлемая точность.

    Вычисление времени через разницу computer.uptimeочень эффективно, но, к сожалению, чувствительно к рестартам игрового сервера и выгрузке чанков. Время от времени придётся сверяться с другими источниками. Интервал сверки определяется точностью, на которую игрок нацелен.

     

    вся файловая система забуферизирована в ОЗУ и никакого лишнего "дергания" жесткого диска хоста не происходит. ОС глобально сохраняет изменения на диск не чаще, чем раз в 30 сек, а может и реже.

    Интересная информация. Надо будет как-нибудь стресс-тест прогнать.

     

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

    Согласен, трудно найти что-то лучше. Для логирования событий на сервере Майнкрафта этот способ вне конкуренции. А если на сервере уже есть вменяемая синхронизация времени, то и для остальных целей тоже – лучший способ. Но, как говорилось, дьявол кроется в деталях. Игроки и сервера бывают разные. Рядовой игрок Майнкрафта не знает, какой способ синхронизации часов сервера выбрал админ, как сильно часы будут отставать или убегать и какие рывки они совершат в будущем. Как и админ не знает заранее, насколько часто любителей точного времени будут дёргать файловую систему, и сколько их окажется на сервере в одном интервале времени.

  4. OC-Minecarts – интересный модик. И после экспериментов с ним у меня возник вопрос.

     

    Редстоун-карта как первого, так и второго уровней без проблем помещается в компьютерную вагонетку – как при сборке, так и в контейнер для плат. Но компонент redstone почему-то отсутствует, игнорируя наличие красной платы в вагонетке. Это баг или фича?

    • Нравится 1

  5. http://computercraft.ru/topic/688-poluchenie-tochnogo-realnogo-vremeni

    а вот этого мало? в крайнем случае, если нет файловой системы(например, какой-нибудь микроконтроллер), можно поставить ПК, который будет тебе это время по беспроводной сети пересылать

    Маловато. Во-первых, возвращается локальное время сервера, зависящее исключительно от предпочтений админа. Во-вторых, каждую секунду дёргать файловую систему ради получения точного времени — тоже сомнительная идея, которая при массовом использовании вряд ли будет одобрена админом.

     

    Самый правильный способ, на мой взгляд, как уже предложил @ivan52945, использовать ComputerCraft для отслеживания рестарта сервера. А время корректировать сразу после рестрата и каждые 15 минут, например.

     

    Интересно было бы рассмотреть возможность использования каких-либо схем на красной пыли, но единственное, что я смог сразу вспомнить — это сенсор робота-рыбака, сбивающийся при выгрузке чанка. Вряд ли кто-то захочет использовать такую схему в часах.

     

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


  6. а там периодически корректировать ошибки не надо при таком раскладе? или всё норм

    Надо корректировать после каждого рестарта сервера. Как отследить этот момент, не ясно, поэтому надо корректировать периодически. А вот, как часто надо корректировать, зависит от условий задачи. Слишком частые обращения к сервису чреваты баном по IP, а редкие коррекции лишают такие часы смысла. Заходишь такой после рестарта сервера, а часы отстают на минуту-две. Зачем они тогда вообще нужны? Да и вообще, хороший вопрос, зачем наблюдать реальное время именно в Майнкрафте, когда есть более удобные инструменты. Сделать более-менее правдоподобные часики реально, но админ сервера не будет рад использованным методам.

  7. Сделал систему драйверов.

    А зачем нужны драйверы? В настоящих системах, использующих разношерстное оборудование, назначение драйверов понятно. А в OpenOS они зачем нужны? Какое такое разнообразие протоколов приводится к единому стандарту?

  8. Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать.

    Глобальные переменные не совсем зло. Они всё-таки необходимы для некоторых целей. Память занимают любые переменные, но локальные работают быстрее. Правда, есть нюансы, о которых где-то рассказывал @ECS: если часто вызывать функцию, внутри которой определена локальная переменная, то вместо ускорения можно получить замедление. Выход из ситуации заключен в создании локальных переменных на уровнях выше часто вызываемых функций. К слову, затраты на доступ к глобальной переменной эквивалентны затратам на доступ к полю локальной таблицы.

     

    Главная же особенность глобальных переменных заключена в том, что они доступны любым программам, запущенным в данном окружении. С одной стороны, это ведёт к замусориванию глобального окружения и созданию помех одними запускаемыми программами другим программам, а с другой, глобальне переменные при грамотном использовании дают программам механизм обмена данными через глобальное окружение. И если не стоит именно такая задача, то глобальные переменные создают больше проблем, чем решают их.

    • Нравится 1

  9. Недавно наткнулся на пост о довольно интересном соревновании для роботов пылесосов

    ...

    Если надо будет организовать такое соревнование, я готов. Это не трудно ( на первый взгляд, конечно ).

    Можно помочь с организацией соревнований дронов-пылесосов.
    • Нравится 1

  10.  

        local cdir = fs.segments(cfg)
        table.remove(cdir)
        cdir = table.concat(cdir, "/")
        if not fs.exists(cdir) then
            fs.makeDirectory(cdir)--Тут можно добавить рекурсивное создание коталогов до нужного. Но мне кажется это ужн перебор)
        end
    

     

    Если рекурсивное создание каталогов не требуется, то зачем нужны лишние действия по разбору пути к файлу на части и последующей их сборке?

    Есть же filesystem.path(path)


  11.  

    env = _G
     
    function env.io.stdout:write(...)
    m.broadcast(512, ...)  
    end
    НО! Теперь перенаправляется вывод не только программ, запущенных через удаленный доступ, но так же и программ, запущенных через сам комп

     

    Так и должно быть. Переназначение io.stdout:write в глобальном окружении перенаправляет весь стандартный вывод в модем.

     

    Для перенаправления вывода лишь определенных потоков, следует пересоздать таблицу io.stdout в их окружении, скопировав поля, оставшиеся неизменными. Также должны быть заново созданы родительские таблицы:

    -- создание таблицы нового окружения, копирование всех полей из старого
    local env = {}
    for k,v in pairs(_G) do
      env[k]=v
    end
    -- ссылка на глобальное окружение в новом окружении
    env._G=env
    -- подмена таблицы env.io с копированием полей из старой
    env.io={}
    for k,v in pairs(_G.io) do
      env.io[k]=v
    end
    -- подмена таблицы env.io.stdout с копированием полей из старой
    env.io.stdout={}
    for k,v in pairs(_G.io.stdout) do
      env.io.stdout[k]=v
    end
    -- подмена функции env.io.stdout.write в новой таблице
    function env.io.stdout:write(...)
      m.broadcast(512, ...)
    end
    • Нравится 1

  12. все методы и поля таблиц, хоть как-либо используемые самой библиотекой, заменены на единоразово созданные локальные переменные.

    Чётко! И сборщик мусора зря не напрягается, и результаты вычислений используются повторно.

  13. Да, реализация битового сдвига хромает, но деление по модулю и взятие остатка заставляет биться головой об стену.

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

  14. как ты пришел к такому решению?

    Не уверен, что я понял вопрос. Это решение обратно преобразованию idx = x + y*80 + z*80*64, оно изначально задумывлось таким образом, чтобы получить однозначное соответствие частных индексов и общего.

     

    Попробуем для начала излечь x. Нам известно, что значение x находится в диапазоне [0..79], а idx равен сумме x и еще какого-то числа, кратного 80.

    Логично, что для получения x достаточно взять остаток от деления idx%80.

    Далее i получает значение целочисленного деления i//80

    Теперь i = y + z*64

     

    Теперь извлекаем y, зная, что значение y находится в диапазоне [0..63], а i равен сумме y и еще какого-то числа, кратного 64.

    Значение y будет равно остатку от деления i%64,

    а i получает значение целочисленного деления i//64

    Теперь i = z

     

    Осталось присвоить z = i, и задача решена.

    • Нравится 1

  15. Предположим, нужен массив [x,y,z] размером 80x64x20

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

     

    Выбираем любой из индексов. Пусть это будет x.

    Изменение x на единицу будет приводить к изменению общего индекса на единицу.

    x ограничен 80 значениями. Значит, последующие индексы надо будет умножить на 80

     

    Теперь выбираем следующий индекс. Пусть это будет y.

    Изменение y на единицу будет приводить к изменению общего индекса на 80, как мы поняли выше.

    y ограничен 64 значениями. Значит, последующие индексы надо будет умножить на 64. И не забываем об умножении на 80. То есть, на 80*64.

     

    Теперь остался индекс z.

    Исходя из предыдущих рассуждений, изменение z на единицу будет приводить к изменению общего индекса на 80*64.

    z ограничен 20 значениями. Значит, последующие индексы надо будет умножить на 20. И не забываем об умножении на 80*64. То есть, на 80*64*20.

    Но других индексов после z не наблюдается, поэтому не забиваем себе голову.

     

    Итоговая формула: idx = x + y*80 + z*80*64

     

    При выборе другого порядка индексов формула может отличаться. Следует придерживаться выбранной схемы.

     

    Для получения частных индексов из общего индекса используется обратная схема:

    i=idx
    x=i%80 i=(i-x)/80
    y=i%64 i=(i-y)/64
    z=i
    Эту последовательность вычислений можно (и нужно) оптимизировать, избегая лишних присваивний, но она лучше подходит для объяснения алгоритма.

     

    Пример

    > X,Y,Z = 80,64,20
    > x,y,z = 37,21,11
    > idx = x + y*X + z*X*Y
    > =idx
    58037
    > i=idx
    > x=i%80 i=(i-x)/80
    > y=i%64 i=(i-y)/64
    > z=i
    > =x,y,z
    37      21      11
    И надо помнить, что индексы в этой схеме нумеруются от нуля в отичие от принятого в Lua.
    • Нравится 1
×
×
  • Создать...