eu_tomat
-
Публикации
2 666 -
Зарегистрирован
-
Посещение
-
Победитель дней
331
Сообщения, опубликованные пользователем eu_tomat
-
-
Пфхахаха! Действительно, а что это мы. Нам лишь бы про Lua, да OpenComputers флудить. Да еще и про ComputerCraft иногда.Чё вы так все, я вообще не для OpenComputers. Я просто хочу сделать луа скрипт который бы синкал время мск, и выставлял дату в винде
Для выставления времени в винде не нужен скрипт. Находишь в интернете какой-нибудь NTP-сервер, да прописываешь его в настройках. Да и наверняка какой-нибудь time.windows.com уже прописан, осталось только галочку поставить для синхронизации.
-
Представить сложно, но ТС хочет получить (цитата) "реальное московское время", не уточнив, правда, насколько оно должно быть близким к реальному.В детском майнкрафте сложно представить ситуацию, где требуется супер точное астрономическое время вплоть до иоктосекунд, а также высокая частота его получения.
Одного игрока устроит погрешность и в одну-две минуты, а какой-то маньяк будет пытаться довести ее до хотя бы 200ms. Это первый нюанс, создающий почву для дискуссии о методах получения времени и создаваемой при этом нагрузки.
Второй нюанс в том, что игровые сервера бывают разные, и на каких-то из них ход часов может быть пущен на самотек, вынуждая игроков обращаться к внешним серверам и писать своё подобие ntpd. Если при этом серверное время еще иногда и корректируется рывками, то тут остаётся лишь постоянно долбить внешние сервера, пока те не забанят. Или придется снизить требования точности.
Вычисление времени через разницу computer.uptimeочень эффективно, но, к сожалению, чувствительно к рестартам игрового сервера и выгрузке чанков. Время от времени придётся сверяться с другими источниками. Интервал сверки определяется точностью, на которую игрок нацелен.Мне кажется, для часиков там достаточно при старте (и потом где-нибудь раз в час) синхронизировать состояние. А потом просто слипами отсчитывать секунды / минуты. Минимум нагрузки, приемлемая точность.
Интересная информация. Надо будет как-нибудь стресс-тест прогнать.вся файловая система забуферизирована в ОЗУ и никакого лишнего "дергания" жесткого диска хоста не происходит. ОС глобально сохраняет изменения на диск не чаще, чем раз в 30 сек, а может и реже.
Согласен, трудно найти что-то лучше. Для логирования событий на сервере Майнкрафта этот способ вне конкуренции. А если на сервере уже есть вменяемая синхронизация времени, то и для остальных целей тоже – лучший способ. Но, как говорилось, дьявол кроется в деталях. Игроки и сервера бывают разные. Рядовой игрок Майнкрафта не знает, какой способ синхронизации часов сервера выбрал админ, как сильно часы будут отставать или убегать и какие рывки они совершат в будущем. Как и админ не знает заранее, насколько часто любителей точного времени будут дёргать файловую систему, и сколько их окажется на сервере в одном интервале времени.Так что, скорее всего, способ получения времени из даты модификации файла - самый менее ресурсозатратный, мгновенный и безотказный, уж тем более в случае, если кому-то вдруг взбрендит в голову слать ежесекундно get запросы куда-то в какую-то удаленную попку или что-то на редстоуне городить)
-
OC-Minecarts – интересный модик. И после экспериментов с ним у меня возник вопрос.
Редстоун-карта как первого, так и второго уровней без проблем помещается в компьютерную вагонетку – как при сборке, так и в контейнер для плат. Но компонент redstone почему-то отсутствует, игнорируя наличие красной платы в вагонетке. Это баг или фича?
-
1
-
-
А откуда взялся такой странный делитель?не актуально, вот полу-рабочий вариант (часы/минуты подкоректировать нужно) https://pastebin.com/vCihbKm1
fs.lastModified("/tmp/.time") / 1002.7Разве не на 1000 нужно делить?-
1
-
-
Маловато. Во-первых, возвращается локальное время сервера, зависящее исключительно от предпочтений админа. Во-вторых, каждую секунду дёргать файловую систему ради получения точного времени — тоже сомнительная идея, которая при массовом использовании вряд ли будет одобрена админом.http://computercraft.ru/topic/688-poluchenie-tochnogo-realnogo-vremeni
а вот этого мало? в крайнем случае, если нет файловой системы(например, какой-нибудь микроконтроллер), можно поставить ПК, который будет тебе это время по беспроводной сети пересылать
Самый правильный способ, на мой взгляд, как уже предложил @ivan52945, использовать ComputerCraft для отслеживания рестарта сервера. А время корректировать сразу после рестрата и каждые 15 минут, например.
Интересно было бы рассмотреть возможность использования каких-либо схем на красной пыли, но единственное, что я смог сразу вспомнить — это сенсор робота-рыбака, сбивающийся при выгрузке чанка. Вряд ли кто-то захочет использовать такую схему в часах.
Возможно, кто-то найдёт более удачный способ отслеживания момента перезагрузки чанка без использования ComputerCraft.
-
Какова ирония! То, что всегда считалось недостатком ComputerCraft, в определённой ситуации стало достоинством.компуктеркрафт мог бы это отследить, ибо там проги зависят от релода сервака
-
2
-
-
Надо корректировать после каждого рестарта сервера. Как отследить этот момент, не ясно, поэтому надо корректировать периодически. А вот, как часто надо корректировать, зависит от условий задачи. Слишком частые обращения к сервису чреваты баном по IP, а редкие коррекции лишают такие часы смысла. Заходишь такой после рестарта сервера, а часы отстают на минуту-две. Зачем они тогда вообще нужны? Да и вообще, хороший вопрос, зачем наблюдать реальное время именно в Майнкрафте, когда есть более удобные инструменты. Сделать более-менее правдоподобные часики реально, но админ сервера не будет рад использованным методам.а там периодически корректировать ошибки не надо при таком раскладе? или всё норм
-
А зачем нужны драйверы? В настоящих системах, использующих разношерстное оборудование, назначение драйверов понятно. А в OpenOS они зачем нужны? Какое такое разнообразие протоколов приводится к единому стандарту?Сделал систему драйверов.
-
Пусть будет. Если проблема сохраняется, то способы ее решения полезно знать не только тому, кто решился задать вопрос.7 месяцев прошло. в - вовремя
-
2
-
-
Глобальные переменные не совсем зло. Они всё-таки необходимы для некоторых целей. Память занимают любые переменные, но локальные работают быстрее. Правда, есть нюансы, о которых где-то рассказывал @ECS: если часто вызывать функцию, внутри которой определена локальная переменная, то вместо ускорения можно получить замедление. Выход из ситуации заключен в создании локальных переменных на уровнях выше часто вызываемых функций. К слову, затраты на доступ к глобальной переменной эквивалентны затратам на доступ к полю локальной таблицы.Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать.
Главная же особенность глобальных переменных заключена в том, что они доступны любым программам, запущенным в данном окружении. С одной стороны, это ведёт к замусориванию глобального окружения и созданию помех одними запускаемыми программами другим программам, а с другой, глобальне переменные при грамотном использовании дают программам механизм обмена данными через глобальное окружение. И если не стоит именно такая задача, то глобальные переменные создают больше проблем, чем решают их.
-
1
-
-
Можно помочь с организацией соревнований дронов-пылесосов.Недавно наткнулся на пост о довольно интересном соревновании для роботов пылесосов
...
Если надо будет организовать такое соревнование, я готов. Это не трудно ( на первый взгляд, конечно ).
-
1
-
-
Если рекурсивное создание каталогов не требуется, то зачем нужны лишние действия по разбору пути к файлу на части и последующей их сборке?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)
-
Пояснение:
sides.side - обращение к полю с именем side в таблице sides.
sides[side] - обращение к полю с именем, содержащейся в переменной side, и находящимся в таблице sides
-
1
-
-
-
Пикнуть и выключить, если на то пошло. Но этому способу приходится конкурировать с массой других, в том числе и рекордно компактных.Хотя это оригинальный способ пикнуть дроном.
-
local, конечно же, не крашит. А вот, require не даст взлететь твоему дрону.Я считаю нужно вот так:
local computer = require("computer")Хоть программа может быть и в дроне, но local никогда не крашила проги
-
1
-
-
-
Так и должно быть. Переназначение io.stdout:write в глобальном окружении перенаправляет весь стандартный вывод в модем.env = _G function env.io.stdout:write(...) m.broadcast(512, ...) end
НО! Теперь перенаправляется вывод не только программ, запущенных через удаленный доступ, но так же и программ, запущенных через сам компДля перенаправления вывода лишь определенных потоков, следует пересоздать таблицу 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
-
-
Чётко! И сборщик мусора зря не напрягается, и результаты вычислений используются повторно.все методы и поля таблиц, хоть как-либо используемые самой библиотекой, заменены на единоразово созданные локальные переменные.
-
А можешь скинуть ссылочку на твиттер Рида?Рид вообще в твиттере написал, что
-
Интересно. Не ожидал такого от Lua. Понятно, что на уровне железа битовый сдвиг реализуется гораздо проще деления, но затраты на интерпретацию Lua должны, как мне казалось, заметно превышать и нивелировать эти аппаратные нюансы.Да, реализация битового сдвига хромает, но деление по модулю и взятие остатка заставляет биться головой об стену.
-
Не уверен, что я понял вопрос. Это решение обратно преобразованию 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
-
-
Предположим, нужен массив [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
-
-
Апргрейд-крафт спасёт нас.а крафтить как вы собираетесь?

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