Для разнообразия. Вообще смена картинок полезна для OLEDов в плане профилактики выгорания. Себе поставил 12 000 обоев, которые меняются каждую минуту. Нагрузка идёт на видеокарту и только в момент смены, ибо переход анимирован.
Что касается утилизации процессорных мощностей — они и без этого разберутся как их утилизировать, у них отлично получается, оптимизация же не нужна никому.
Могли бы просто вернуть ActiveDesktop из Windows 98. Сколько же всего можно было бы делать на современном HTML5: и виджеты, и анимации, и шейдеры, и смена фона, и эффекты, и время с календарями, и подбор содержимого, и новости, и векторная графика, и ещё куча всего. Причём, насколько я понимаю, раз Active Desktop они сделали, то они его запатентовали, то есть права на ИС и прочие юридические аспекты у них закрыты. Надо просто сделать и всё. Да, есть WallpaperEngine, но это стороннее приложение, а не кусок системы.
А как с FPS? Не снижается от того что захват экрана постоянно идет? У меня отнимается 5–10 fps, и так и не получилось эту проблему победить, хотя вроде бы для захвата использую DirectX. Видимо остаются только карты захвата и/или влезать в мозги экранам.
Насколько я понял, связка 16 медленных ядер + 8 быстрых во всяких i9 как раз направлена на это — вся фоновая шелуха отправляется на медленные ядра, чтобы основные 8 не отвлекались, когда их помощь действительно понадобится. И, судя по тому, что они хотят отказаться от HyperThreading, решение им кажется удачным.
В самых первых айфонах, ЕМНИП, тоже было что‑то подобное, только на уровне софта — интерфейс крутился в потоке реального времени, и контекст сразу переключался на него, как только пользователь касается экрана. Именно поэтому айфоны не тормозили, в отличие от андройдов тех лет.
Однако, я не уверен, что, когда я щёлкаю правой кнопкой мыши по рабочему столу и жду, пока загрузится меню — это оно ждёт пока все контексты переключатся, а вовсе не потому что кто‑то немного, самую капельку, что‑то неоптимально написал и выкинул в продакшн. Или почему скорость (fps) ресайза окна проводника зависит от разрешения экрана, а не от размеров окна проводника. Предположу, что программист сразу выделяет буфер размером с экран, чтобы не заморачиваться каждый раз. Ладно, всё равно видеопамять никому не нужна, зачем её экономить. Но что же он с ним такого делает, что перерисовка происходит 20 кадров в секунду? Изменение размера окна требует каких‑то невероятных вычислений? А диспетчер задач вообще до 5 fps падает в аналогичной ситуации.
По моим наблюдениям Windows 11 на Ryzen 7950x работает существенно менее отзывчиво, чем Windows 98 на Celeron 266 Mhz. Как бы не ушло всё опять на новую абстракцию над абстрактным абстрагированным GUI фраемворком который на чтение каждого байта файла читает его заново целиком и попутно создает сверхценный телеметрический 2 Мб json отчёт об этом.
Из текста непонятно: если верёвка рвётся, то почему паровозики пополам не рвутся? Одновременность старта их начала и конца тоже относительная.
Паровозик состоит из конца паровозика и начала паровозика, которые соединены серединой паровозика. Начало и конец паровозика трогаются одновременно и ускоряются. Их длина сокращается. Что будет с серединой?
Работает же? Работает. Да, не быстро, да, код неоптимальный. Но для начала, имхо, очень хорошо. В коде прослеживается именно человеческая логика, без оглядки на всякие особенности «мышления» машины (именно эти особенности диктуют «использовать Dictionary» и прочие вещи). Это нормально, понимание «мышления» машины — это следующий этап. И, глядя на то, как развивается технология, которую все называют «ИИ», не уверен, что это глубокое понимание мышления машины будет прям нужно, кроме узких случаев. Всякое ChatGPT + генетические алгоритмы хорошо будут генерировать быстрый оптимальный код, имхо.
Уже сейчас процессор может выполнять код по‑своему, переставляя команды и делая прочие штуки. Я уже не говорю про оптимизирующие компиляторы. В будущем это вообще может свестить к «компилятор/процессор читает код» → «компилятор/процессор понимает, чего от него хотят» → «пишет с нуля свой ультраоптимальный код, делающий то же самое, но хорошо, быстро, замечательно и с правильно поставленными отступами» → «выполняет код». И да, на входе, может быть уже не код, а вполне человеческий язык. Почему нет.
Да, программист («машинный тренер»?) уже не будет понимать/знать что там происходит. Но сейчас это тоже есть: программист на питоне почти всегда не знает, как там выделяется память и как вообще синхронизируются такты у блоков процессора, но это абстрагирование не мешает создавать продукты, пусть и не очень оптимальные. Программисту на питоне это не обязательно для решения задачи.
PS. Вот быстрый вариант в виде класса, чтобы примерно показать, что есть «затачивание под особенности мышления машины». Общий смысл: вместо того, чтобы каждый раз думать и что‑то искать на каждой букве, мы один раз создаём таблицу для всех возможных вариантов и комбинаций, и потом тупо дёргаем оттуда готовые значения. Это как таблица умножения. В моём варианте используются массивы, но можно использовать Dictionary, код будет лучше и проще, но чуть медленнее.
Можно ещё нажестить с unsafe/Marshal.AllocHGlobal с указателями, и всё будет ещё быстрее, но смысла в этом здесь нет, имхо: оно будет уже совсем страшное.
Класс PolybiusQuad
using System.Text;
public class PolybiusQuad
{
public PolybiusQuad()
{
//При создании класса заполняем таблицу дефолтными значениями
Table = new char[,]
{
{ 'A', 'B', 'C', 'D','E' },
{ 'F', 'G', 'H', 'I', 'K' },
{ 'L', 'M', 'N', 'O', 'P' },
{ 'Q', 'R', 'S', 'T', 'U' },
{ 'V', 'W', 'X', 'Y', 'Z' },
};
}
//Помимо типа string, который текст, есть ещё тип char
//char - это один символ
//Тут храним табличку-квадрат
char[,] table;
//Это свойство-обёртка таблички
//Нам это нужно, чтобы после каждого присваивания Table выполнялись наши методы пересчёта карт
public char[,] Table
{
get => table; //get происходит, когда значение Table считывают
set //происходит, когда Table прирванивают к чему-то
{
if (value == null)
throw new NullReferenceException("Не надо так");
table = value.Clone() as char[,];
/*
* почему не просто table = value;
*
* есть риск, что сначала нам зададут table, а потом поменяеют в ней значения
* переменные типа char[,] хранят не саму таблицу, а ссылку на неё
* мы тут детектим изменение ссылки, а не самих значений
* изменение самих значений не вызовет rebuildTableMap() и rebuildAntimap()
* это потенциальный баг и плохо, поэтому мы создаём копию с помощью метода Clone()
* а поскольку C# древнее зло, и метод Clone() тоже, он возвращает не char[,] а страшный ужас
* чтобы вернуть его в тип char[,] используется оператор as. Можно ещё сделать (char[,])value
*/
/*При каждом задании новой таблицы пересчитываем карты преобразования в квадрат и обратно.
* карты позволят нам работать очень быстро
* программа не будет что-то там искать на каждой букве
* она просто будет дёргать готовые значения из карты-массива по номеру
* а номер будет вычисляться очень легко
*/
rebuildTableMap();
rebuildAntimap();
}
}
//длина карты преобразования (шифровки)
const int linearTableLength = char.MaxValue + 1; //65535 + 1
/*карта преобразования В квадрат
* идея следующая:
* 1) В C# string - это набор charов, char - это символ (буква, цифра, знак препинания и т.п.)
* 2) Всех возможных символов 65536, потому что char состоит из двух байт. Каждый байт имеет 256 возможных значений, всех возможных комбинаций всех байтов 256 * 256 = 65536. Соответственно, всех возможных значений char тоже 65536
* 3) В то же время, char можно интерпретировать как число. По сути, это и есть число от 0 до 65535. Это, как бы, номер в алфавите, только алфавит тут в 65536 букв. Поэтому мы можем взять букву, и использовать её как номер элемента массива. Не номер буквы в тексте, а прям саму букву.
* 4) Мы создаём карту преобразования. Подобно тому, как можно выучить таблицу умножения и просто вспоминать нужные результаты, здесь мы будем вспоминать сразу готовые пары чисел для каждой буквы. Чтобы не путаться, эта штука называется картой, а таблица - это исходная таблица Полибия
* 5) Расчёт карты преобразования происходит 1 раз при задании таблицы Полибия, в дальнейшем при каждой шифровке мы пользуемся готовой: берем символ, интерпретируем его как число, вытаскиваем из карты пары готовых значений, добавляем к тексту
* 6) То есть наша карта это такой массив. В качестве индекса у него выступает сам символ (который на самом деле число от 0 до 65535 включительно), а в качестве значений - пара (строка-столбец)
* 7) Нюанс: пару (строка-столбец) мы будем хранить не как пару чисел, а сразу как пару символов, чтобы преобразование числа в символ также вынести в карту и не делать каждый раз при шифровке. Нам же номер строки и столбца надо в стекст добавлять
*/
//карта проеобразования - массив длиной 65656, каждое значение - пара символов. Длина массива такова, что каждому возможному вообще в природе символу мы можем сопоставить пару каких-то других символов
readonly (char row, char column)[] linearTableMap = new (char row, char column)[linearTableLength];
//В качестве типа элементов массива указан не int, не char, а (char row, char column)
//это значит, что каждый элемент массива - пара чисел. Одно называется row, второе - column
//readonly означает, что массив linearTableMap нельзя менять и присваивать, можно менять только значения внутри него
void rebuildTableMap()
{
//Очищаем карту. Каждому элементу массива присваивается значение из пары непечатаемых символов, означающих отсутствие символа
Array.Clear(linearTableMap, 0, linearTableLength);
//Проходим по всем строкам и столбцам табилцы
for (int row = 0; row < table.GetLength(0); row++)
for (int column = 0; column < table.GetLength(1); column++)
{
//Берем символ из таблицы
var symbol = table[row, column];
var rowChar = (char)(row + '0' + 1); //Это быстрый аналог (row + 1).ToString()
var columnChar = (char)(column + '0' + 1); //Это быстрый аналог (column + 1).ToString()
/* Почему (char)(row + '0' + 1) это быстрый аналог (row + 1).ToString()
*
*
* Дело в том, что, хотя символы можно
* интерпретировать как числа, а числа как символы (например, 'Ы' есть число 1067, а '!' есть число 33)
* символы цифр - 0, 1, 2, 3 ... 9
* не совпадают с их численными эквивалентами,
* то есть символ '0' не есть число 0, символ '0' есть число 48,
* а символ '7', например, есть число 55
* В целом всё вот так:
'0' это 48
'1' это 49
'2' это 50
'3' это 51
'4' это 52
'5' это 53
'6' это 54
'7' это 55
'8' это 56
'9' это 57
* то есть значения не совпадают. Однако есть нюанс: совпадает порядок
* поэтому, если прибавить символ '0' к номеру колонки, то получим символ, означающий номер колонки. Потому что C# интерпретирует '0' как число 48 и сложит его с номером колонки
* важно понимать: '0' - это символ, а "0" - это строка из одного символа. Повеедение у них оттличается:
* когда делаем "0" + row - это мы к строке "0" добавим номер строки, и получим что-то в духе "03", то есть оно превратит row в строку и потом просто стыкует их (конкатенация)
* когда делаем '0' + row - это мы к числу 48 прибавим номер строки, и получим, например, 51. То есть оно '0' превращает в число, и потом складывает два числа
*
* Поэтому преобразование номера строки в символ, который означает номер строки, имеет вид:
* (char)(row + '0')
* Но у нас номера надо выводить не с нуля, а с единицы, поэтому смещаемся ещё на 1:
* (char)(row + '0' + 1)
*/
//Получили символ номера строки и символ номера колонки
//Теперь сохраним их в виде пары в одну переменную
var numberPair = (rowChar, columnChar); //Так можно объединять несколько значений, т.е. можно, например, написать var number = (3,2);
//Взяли тот символ, например, 'A' или 'H'
//И использовали его как номер в массиве
//В этом случае C# интерпретирует symbol как число
//К примеру, 'A' - это 65
linearTableMap[symbol] = numberPair;
}
//Теперь для любой существующей буквы у нас есть пара символов (не цифр, а сразу букв!), означающая строку и столбец в таблице Полибия при нумерации с 1
//Если в таблице Полибия такой буквы нет, то значения в карте будут равны паре особых непечатаемых символов, означающих отсутствие символа
//Ещё щепотка магии: вносим в карту пробел, и говорим,
//что его пара символов - это не всякие '1', '2', '3' и прочее, а символы переноса строки
//так мы добъёмся того, что пробелы будут заменяться на переносы строки
{
var nl = Environment.NewLine; //Символ новой строки в Windows состоит из двух символов, в Linux из одного
if (nl.Length == 2)
linearTableMap[' '] = (nl[0], nl[1]);
else
linearTableMap[' '] = (' ', nl[0]);
}
//и происходить это будет по той же таблице
}
/*А это карта обратного преобразования пар чисел в букву
* тут всё хитрее:
* каждая буква у нас - это два символа-числа.
* 1) делаем метод, который принимает на вход сразу два символа и возвращает уникальный номер в карте, по которому дёргаем символ
* 2) но размер карты получится суровым: поскольку всех существующих символов 65536, то всех возможных комбинаций пар этих символов 65536 * 65536 = 4 294 967 296, то есть больше 4 миллиардов
* 3) карта у нас - это массив char ов, каждый char занимает 2 байта. Соответственно, нам понадобится 8.6 ГБайт оперативной памяти, чтобы вместить всё
* 4) это слишком сурово на сегодняшний день, поэтому попытаемся уменьшить объем, зарезав функционал
* 5) если интерпретировать символы как числа, то из русского и английского алфавитов-цифр-знаков препинания самое большое значение
* имеет строчная буква 'ё', она равна 1105. Все остальные потенциальные символы меньше.
* 6) Поэтому мы спокойно делаем карту длиной не 65536*65536 значенйи, а всего лишь 1105*1105 значений. Это чуть больше миллиона
* 7) Символ пробела ' ' есть число 32
* 8) Символы перевода строки обычно числа 10 и 13
*/
const int biggestCharWhatAllowed = 'ё' + 1;
//Функция, преобразуюущая два символа в номер в карте. Действие основано на интерпретации символа как числа
static int rowColumnCharsToAntimapIndex(char row, char column) => row * biggestCharWhatAllowed + column;
//Длина карты обратного преобразования (дешифровки)
const int antimapLength = biggestCharWhatAllowed * biggestCharWhatAllowed;
//сама карта обратного преобразования
readonly char[] linearAntimap = new char[linearTableLength];
void rebuildAntimap()
{
//очищаем карту
Array.Clear(linearAntimap, 0, linearTableLength);
//проходим по таблице
for (int row = 0; row < table.GetLength(0); row++)
{
char rowChar = (char)('1' + row); //Преобразуем номер строки в символ, означающий номер строки при нумерации с 1
for (int column = 0; column < table.GetLength(1); column++)
{
char columnChar = (char)(column + '1'); //Преобразуем номер столбца в символ, означающий номер столбца при нумерации с 1
//Получаем номер в карте
var index = rowColumnCharsToAntimapIndex(rowChar, columnChar);
//Указываем, что по этому номеру у нас символ из таблицы
linearAntimap[index] = table[row, column];
}
}
//Делаем магию для того, чтобы символы перевода строки превращались в пробелы
if (Environment.NewLine.Length == 1)
{
//Если длина символа перевода строки в данной операционной системе равна 1
//То перебираем все возможные комбинации этого символа со всеми возможными номерами и пробелом
var index = rowColumnCharsToAntimapIndex(Environment.NewLine[0], ' ');
linearAntimap[index] = ' ';
for (int number = 0; number < 9; number++)
{
//по этой комбинации находим индекс
index = rowColumnCharsToAntimapIndex(Environment.NewLine[0], (char)(number + '1'));
//и говорим интерпретировать эту комбинацию как пробел
linearAntimap[index] = ' ';
}
}
else
{
//Если длина символа перевода строки в данной операционной системе равна 2
//то говорим, что данная пара символов - это пробел
var index = rowColumnCharsToAntimapIndex(Environment.NewLine[0], Environment.NewLine[1]);
linearAntimap[index] = ' ';
}
}
/// <summary>
/// Шифровка
/// </summary>
public string Encrypt(string text)
{
if (string.IsNullOrWhiteSpace(text))
return string.Empty;
//Штука для быстрого составления строк
var r = new StringBuilder();
//Перебираем все символы текста
foreach (char c in text)
{
/*Интерпретируя каждый символ как число
* выдёргиваем пару строка-столбец из карты-массива для этого символа
*/
var (row, column) = linearTableMap[c];
//row и column - это не числа, это уже сразу символы, означающие номера
//потому что мы заранее сделали это преобразование при составлении карты
//и карту составляли с символами, а не числами
if (row == '\0') // '\0' это не '0'. '\0' это особый непечатаемый символ, числовое значение которого как раз равно 0. Напомню, у '0' числовое значение это 48. Когда мы обнуляли массивы charов, они все выставились в значение '\0'
throw new Exception($"Ошибка! Символ {c} не поддерживается!");
r.Append(row); //Добавляем номер строки
r.Append(column); //Добавляем номер столбца
r.Append(' '); //Пробел
}
return r.ToString();
}
/// <summary>
/// Дешифровка
/// </summary>
public string Decrypt(string quad)
{
if (string.IsNullOrWhiteSpace(quad))
return string.Empty;
var r = new StringBuilder();
/*Перебираем все символы начиная со ВТОРОГО, храним предыдущий символ и текущий
* Тут нам типо как бы надо сначала разделить всё на строки, потом на пары чисел, разделённых пробелами
* и только потом начинать распознавание. Но вместо этого мы опять делаем немного уличной магии
* мы тупо перебираем все символы по одному, но начинаем не с нулевого, а с первого
*
* если текущий символ и предыдущий - это числа, значит мы должны распознать букву и добавить её к тексту
* если текущий символ и предыдущий - это перевод строки, значит мы должны добавить пробел к тексу
* в остальных случаях тупо идём дальше. То есть когда у нас встретилось "55" или "31" мы думаем и делаем дело
* а когда встретилось "5 " или " 3" - это значит мы ещё недостаточно сместились, поэтому тупо идём дальше
* то есть мы берем два символа, если это пара чисел или новая строка - делаем дело, если нет - мы понимаем,
* что это мусор, и идём дальше
*
* это первое. Второе: нам ничего из этого проверять не надо, ибо у нас таблица.
* Вот мы бежим по тексту и втупую берём комбинации пар символов. Нам будут попадаться и осмысленные пары символов-цифр
* и всякий мусор, в котором один символ пробел, а второй число, или перевод строки, или ещё что-нибудь
* Наша карта обратного преобразования составлена для всех возможных комбинаций символов вплоть до буквы 'ё' включительно
* Поэтому все мусорные пары в ней тоже встретятся - все комбинации пробелов, запятых, переводов строки, букв и цифр
* Напоминаю: берем пару символов, считаем для них индекс, и по нему дёргаем из массива результирующий дешифрованый символ
* Так вот, для всех мусорных индексов в нашей карте проставлено '\0' - непечатаемый символ, означающий отсутствие символа
* Это произошло когда мы сделали для нашей карты Array.Clear
* А для нормальных комбинаций в духе ('5','3') в карте есть соотвествующая буква, а не '\0'
* Поэтому всё что нам надо делать:
* 1) без оглядки, без проверок просто брать два символа из строки
* 2) считать для них индекс
* 3) по нему дёргать символ из карты обратного преобразования
* 4) если этот символ не '\0', то добавлять к результату
*
* о пробелах мы тоже позаботились при составлении карты обратного преобразования - все комбинации символа перевода строки
* в карте проставлены как пробелы
*/
//В этой переменной храним предыдущий символ. В самом начале это будет первый символ строки
char prevousChar = quad[0];
//Перебираем все символы текста начиная со 2
for (int charIndex = 1; charIndex < quad.Length; charIndex++)
{
//Берем текущий символ
var currentChar = quad[charIndex];
//Вычисляем номер в карте-массиве обратного преобразования
var index = rowColumnCharsToAntimapIndex(prevousChar, currentChar);
//Тупо вытаскиваем из карты обратного преобразования имвол
var symbol = linearAntimap[index];
//Если это что-то годное, то добавляем к строке
if (symbol != '\0')
r.Append(symbol);
//Обновляем предыдущий символ
prevousChar = currentChar;
}
return r.ToString();
}
/// <summary>
/// Тестирование: возвращает дешифровку шифрованного текста. Должна получиться исходная строка
/// </summary>
public string Test(string text) => Decrypt(Encrypt(text));
}
Использование:
var p = new PolybiusQuad();
/*Если надо задать особую таблицу:
p.Table = new char[,]
{
{ 'B', 'A', 'C', 'D','E' },
{ 'F', 'G', 'H', 'I', 'K' },
{ 'L', 'M', 'N', 'O', 'P' },
{ 'Q', 'R', 'S', 'T', 'U' },
{ 'V', 'W', 'X', 'Y', 'Z' },
};*/
//Далее шифруем/дешифруем:
var encryptedStr = p.Encrypt("MAMA MILA RAMY");
var decryptedStr = p.Decrypt(encryptedStr);
Тут да, надо считать. Однако, имхо, до определённого предела это работать будет, пока атомы железа не вырвет из молекул гемоглобина:)
Если этого будет мало — создать искусственное гравитационное поле в передней части корабля, чтобы это гравитационное поле, грубо говоря, притягивало тело вперёд так, чтобы компенсировать всё ускорение, за исключением 1g.
В том то и фокус, что оказывает. Речь не о магнитной левитации, а о диамагнетической. Диамагнетические материалы не «не магнитятся», они выталкиваются магнитным полем, просто этот эффект очень слабый.
Лягушка в магнитном поле >10 тесла, с ней всё ок
И магнитное поле оказывает влияние именно на каждый атом. Главное, чтобы поле было равномерное, это как бы сложно, но с лягушкой же получилось. В обычных условиях, если положить маленькую графитовую пластинку на неодимовый магнит, она начнёт парить — по той же причине.
Поэтому, имхо, можно использовать диамагнетическую левитацию для компенсации ускорения.
Ну если у нас задача не только заварить дошик, но ещё и выжить, то можно задействовать диамагнетическую левитацию, чтобы скоменсировать ускорение.
Генерируем магнитное поле в 10 000 Тл и отталкиваем тушку в сторону, противоположную ускорению. Поскольку магнит действует на все точки тела, а не на её поверхность, силу, действующую на тело, можно будет снизить до 1 g. При этом, магнитное поле должно быть не просто сильным, а устроено хитро, чтобы не было приливных сил. Но если вы построили штуку, которая летает 0,999 999 999 с, то это не есть проблема, скорее всего.
частицы в отличие от людей и есть клоны друг друга
А вот и не факт.
Коллегу я могу отличить по чертам лица, телосложению, голосу, походке, манере речи и десяткам других признаков.
Потому что можете. А если бы не могли? Если бы не существовало, не было открыто методов измерения телосложения, походки, манеры речи, черт лица? Как бы Вы считали — это все клоны или разные люди? Представьте мир, где Вы можете измерить только вес и рост человека, и больше ничего. Считали ли бы Вы, что все люди клоны? А почему бы и не нет? Или таки да? Вот‑вот:)
Так и с частицами — мы не знаем, клоны они или нет. Мы умеем мерить вот это, это и это. Другое мы не знаем и мерить пока не умеем. Действительно ли это все признаки частиц, и других у них нет, и частицы в самом деле такие похожие, или же есть куча других признаков, которые мы пока просто не научились мерить — мы не знаем.
Вот я пролистал страничку выше. Текст сместился. Как я определил, что это «тот самый текст» а не «точно такой же текст, возникший в новом месте»? Ну, это те же буквы, тем же цветом, тем же шрифтом, на том же примерно месте. Плюс я ожидал, что в результате моих действий текст окажется именно выше. Более того, в данном случае, половину «размышлений» сделал за меня мой организм в сетчатке глаза, распознавая движение «аппаратно». Поэтому я считаю, что это «тот самый» текст. А если у меня больше знаний, я, например, знаю, что такое пиксели, и что они на самом деле просто меняют цвет, а видеокарта заново рендерит картинку, я уже могу сказать, что вот, с такой‑то точки зрения это уже не «тот самый текст». И вообще тут движок браузера буфер пересоздал в видеопамяти. По сути, я сам решаю, что считать «тем самым», а что не считать.
Вот тут примерно так же. Понятие «по‑настоящему те самые частицы» слишком условное и субъективное для науки, она прекрасно обходится без него — производит расчеты и предугадывает явления. Поэтому просто провозглашают — считать частицу «той самой», если она такая‑то и подчиняется таким то уравнениям. Всё.
Даже «частица» — это лишь наше понятие о неком явлении/совокупности явлений. Что это «на самом деле», мы не знаем, но когда мыслим об этом, как о «частице», нам удобно, и у нас получается. Поэтому мы говорим, что вот это вот — «частица», и она «летит».
Масса покоя — не есть масса релятивистская. Там все хитрее. Для космонавта его «масса» не поменяется, хотя поводов для физиологических проблем все равно будет море.
Для разнообразия. Вообще смена картинок полезна для OLEDов в плане профилактики выгорания. Себе поставил 12 000 обоев, которые меняются каждую минуту. Нагрузка идёт на видеокарту и только в момент смены, ибо переход анимирован.
Что касается утилизации процессорных мощностей — они и без этого разберутся как их утилизировать, у них отлично получается, оптимизация же не нужна никому.
Могли бы просто вернуть ActiveDesktop из Windows 98. Сколько же всего можно было бы делать на современном HTML5: и виджеты, и анимации, и шейдеры, и смена фона, и эффекты, и время с календарями, и подбор содержимого, и новости, и векторная графика, и ещё куча всего. Причём, насколько я понимаю, раз Active Desktop они сделали, то они его запатентовали, то есть права на ИС и прочие юридические аспекты у них закрыты. Надо просто сделать и всё. Да, есть WallpaperEngine, но это стороннее приложение, а не кусок системы.
Огромное спасибо! Наконец‑то узнал куда копать. Правда рут может создать проблемы с гарантией.
А как с FPS? Не снижается от того что захват экрана постоянно идет? У меня отнимается 5–10 fps, и так и не получилось эту проблему победить, хотя вроде бы для захвата использую DirectX. Видимо остаются только карты захвата и/или влезать в мозги экранам.
Ох уж эти бездушные автоматические ткацкие станки
Насколько я понял, связка 16 медленных ядер + 8 быстрых во всяких i9 как раз направлена на это — вся фоновая шелуха отправляется на медленные ядра, чтобы основные 8 не отвлекались, когда их помощь действительно понадобится. И, судя по тому, что они хотят отказаться от HyperThreading, решение им кажется удачным.
В самых первых айфонах, ЕМНИП, тоже было что‑то подобное, только на уровне софта — интерфейс крутился в потоке реального времени, и контекст сразу переключался на него, как только пользователь касается экрана. Именно поэтому айфоны не тормозили, в отличие от андройдов тех лет.
Однако, я не уверен, что, когда я щёлкаю правой кнопкой мыши по рабочему столу и жду, пока загрузится меню — это оно ждёт пока все контексты переключатся, а вовсе не потому что кто‑то немного, самую капельку, что‑то неоптимально написал и выкинул в продакшн. Или почему скорость (fps) ресайза окна проводника зависит от разрешения экрана, а не от размеров окна проводника. Предположу, что программист сразу выделяет буфер размером с экран, чтобы не заморачиваться каждый раз. Ладно, всё равно видеопамять никому не нужна, зачем её экономить. Но что же он с ним такого делает, что перерисовка происходит 20 кадров в секунду? Изменение размера окна требует каких‑то невероятных вычислений? А диспетчер задач вообще до 5 fps падает в аналогичной ситуации.
По моим наблюдениям Windows 11 на Ryzen 7950x работает существенно менее отзывчиво, чем Windows 98 на Celeron 266 Mhz. Как бы не ушло всё опять на новую абстракцию над абстрактным абстрагированным GUI фраемворком который на чтение каждого байта файла читает его заново целиком и попутно создает сверхценный телеметрический 2 Мб json отчёт об этом.
Свет это электромагнитные волны. В статье речь о том, что можно управлять фазой излучателя волны оптического диапазона.
Будем надеяться что он просто сделал транслятор с какого‑нибудь Verilog, а не руками вот это всё
Ну‑ну.
Хабр торт.
Т. е. при ускорении на тело действует сила, стремящаяся разорвать его. Интересно.
Из текста непонятно: если верёвка рвётся, то почему паровозики пополам не рвутся? Одновременность старта их начала и конца тоже относительная.
Паровозик состоит из конца паровозика и начала паровозика, которые соединены серединой паровозика. Начало и конец паровозика трогаются одновременно и ускоряются. Их длина сокращается. Что будет с серединой?
Работает же? Работает. Да, не быстро, да, код неоптимальный. Но для начала, имхо, очень хорошо. В коде прослеживается именно человеческая логика, без оглядки на всякие особенности «мышления» машины (именно эти особенности диктуют «использовать Dictionary» и прочие вещи). Это нормально, понимание «мышления» машины — это следующий этап. И, глядя на то, как развивается технология, которую все называют «ИИ», не уверен, что это глубокое понимание мышления машины будет прям нужно, кроме узких случаев. Всякое ChatGPT + генетические алгоритмы хорошо будут генерировать быстрый оптимальный код, имхо.
Уже сейчас процессор может выполнять код по‑своему, переставляя команды и делая прочие штуки. Я уже не говорю про оптимизирующие компиляторы. В будущем это вообще может свестить к «компилятор/процессор читает код» → «компилятор/процессор понимает, чего от него хотят» → «пишет с нуля свой ультраоптимальный код, делающий то же самое, но хорошо, быстро, замечательно и с правильно поставленными отступами» → «выполняет код». И да, на входе, может быть уже не код, а вполне человеческий язык. Почему нет.
Да, программист («машинный тренер»?) уже не будет понимать/знать что там происходит. Но сейчас это тоже есть: программист на питоне почти всегда не знает, как там выделяется память и как вообще синхронизируются такты у блоков процессора, но это абстрагирование не мешает создавать продукты, пусть и не очень оптимальные. Программисту на питоне это не обязательно для решения задачи.
PS. Вот быстрый вариант в виде класса, чтобы примерно показать, что есть «затачивание под особенности мышления машины». Общий смысл: вместо того, чтобы каждый раз думать и что‑то искать на каждой букве, мы один раз создаём таблицу для всех возможных вариантов и комбинаций, и потом тупо дёргаем оттуда готовые значения. Это как таблица умножения. В моём варианте используются массивы, но можно использовать Dictionary, код будет лучше и проще, но чуть медленнее.
Можно ещё нажестить с unsafe/Marshal.AllocHGlobal с указателями, и всё будет ещё быстрее, но смысла в этом здесь нет, имхо: оно будет уже совсем страшное.
Класс PolybiusQuad
Использование:
Можно нещадно вертеть на носу корабля кольцо из сверхпроводника, и оно начнёт генерировать гравитационное поле.
https://ru.wikipedia.org/wiki/Сверхпроводимость#Гравитомагнитный_момент_Лондона
Разумеется, есть целая куча нюансов, в том числе, что вращение должно постоянно ускоряться, и это не просто гравитационное, а гравимагнитное поле.
Тут да, надо считать. Однако, имхо, до определённого предела это работать будет, пока атомы железа не вырвет из молекул гемоглобина:)
Если этого будет мало — создать искусственное гравитационное поле в передней части корабля, чтобы это гравитационное поле, грубо говоря, притягивало тело вперёд так, чтобы компенсировать всё ускорение, за исключением 1g.
В том то и фокус, что оказывает. Речь не о магнитной левитации, а о диамагнетической. Диамагнетические материалы не «не магнитятся», они выталкиваются магнитным полем, просто этот эффект очень слабый.
И магнитное поле оказывает влияние именно на каждый атом. Главное, чтобы поле было равномерное, это как бы сложно, но с лягушкой же получилось. В обычных условиях, если положить маленькую графитовую пластинку на неодимовый магнит, она начнёт парить — по той же причине.
Поэтому, имхо, можно использовать диамагнетическую левитацию для компенсации ускорения.
Ну если у нас задача не только заварить дошик, но ещё и выжить, то можно задействовать диамагнетическую левитацию, чтобы скоменсировать ускорение.
Генерируем магнитное поле в 10 000 Тл и отталкиваем тушку в сторону, противоположную ускорению. Поскольку магнит действует на все точки тела, а не на её поверхность, силу, действующую на тело, можно будет снизить до 1 g. При этом, магнитное поле должно быть не просто сильным, а устроено хитро, чтобы не было приливных сил. Но если вы построили штуку, которая летает 0,999 999 999 с, то это не есть проблема, скорее всего.
А вот и не факт.
Потому что можете. А если бы не могли? Если бы не существовало, не было открыто методов измерения телосложения, походки, манеры речи, черт лица? Как бы Вы считали — это все клоны или разные люди? Представьте мир, где Вы можете измерить только вес и рост человека, и больше ничего. Считали ли бы Вы, что все люди клоны? А почему бы и не нет? Или таки да? Вот‑вот:)
Так и с частицами — мы не знаем, клоны они или нет. Мы умеем мерить вот это, это и это. Другое мы не знаем и мерить пока не умеем. Действительно ли это все признаки частиц, и других у них нет, и частицы в самом деле такие похожие, или же есть куча других признаков, которые мы пока просто не научились мерить — мы не знаем.
Вот я пролистал страничку выше. Текст сместился. Как я определил, что это «тот самый текст» а не «точно такой же текст, возникший в новом месте»? Ну, это те же буквы, тем же цветом, тем же шрифтом, на том же примерно месте. Плюс я ожидал, что в результате моих действий текст окажется именно выше. Более того, в данном случае, половину «размышлений» сделал за меня мой организм в сетчатке глаза, распознавая движение «аппаратно». Поэтому я считаю, что это «тот самый» текст. А если у меня больше знаний, я, например, знаю, что такое пиксели, и что они на самом деле просто меняют цвет, а видеокарта заново рендерит картинку, я уже могу сказать, что вот, с такой‑то точки зрения это уже не «тот самый текст». И вообще тут движок браузера буфер пересоздал в видеопамяти. По сути, я сам решаю, что считать «тем самым», а что не считать.
Вот тут примерно так же. Понятие «по‑настоящему те самые частицы» слишком условное и субъективное для науки, она прекрасно обходится без него — производит расчеты и предугадывает явления. Поэтому просто провозглашают — считать частицу «той самой», если она такая‑то и подчиняется таким то уравнениям. Всё.
Даже «частица» — это лишь наше понятие о неком явлении/совокупности явлений. Что это «на самом деле», мы не знаем, но когда мыслим об этом, как о «частице», нам удобно, и у нас получается. Поэтому мы говорим, что вот это вот — «частица», и она «летит».
Масса покоя — не есть масса релятивистская. Там все хитрее. Для космонавта его «масса» не поменяется, хотя поводов для физиологических проблем все равно будет море.