Author Archives: himself

Diary backup

Кто потерял дайри, копию из бэкапов люди подняли по адресу diarybackup.space. Прежний владелец с доменом diary.space якобы перестал выходить на связь. Посты я туда не копирую, потому, что настраивать сложно, а смысла мало. Возможно, потом настрою. Но кто-то ещё ведёт там блоги.

Старый домен diary.ru то ли продал, то ли просто благородно слил один из промежуточных владельцев, т.н. Дракон, решив за всех, что пятибуквенный домен с 25-летней историей не принципиален и лучше его поменять на space. Не знаю, что хуже: если он предатель, который не смог прямо сказать "я выкупил сайт ради домена, домен продам, а сайт мне неважен", или если он дурак и даже не получил на своём предательстве выгоды. Надеюсь, история запомнит его в связи с этим сжиганием Рима. Слив домен, он дайри мгновенно перепродал. В череде безответственных владельцев он одним поступком стал худшим, и по большому счёту сайт уничтожил.

Календарь на лето

(Пополняется по мере поступления сведений!)

25 апреля: Большой БГ (Москва) – район игры, похоже, ЗИЛ/Юго-восток. Единственная настоящая соревновательная из игр БГ! Играйте, очень интересно, особенно если впервые и с друзьями!
04 мая: Казанский марафон
24 мая: Весенний велофестиваль
20-30 июня? Ночной БГ. Волшебная игра!
4 июля: Марафон "Белые ночи", название которого решил в этом году испортить один банк. Марафон прекрасен, самый лёгкий из всех, но места наверняка разобраны.
4 июля: Ночной велофестиваль 1 (опять пропускаю) Рекомендую, кто не попал на Белые ночи!
С июля по сентябрь в Лужниках обычно разные бесплатные групповые беговые тренировки, посещение свободное.
1 августа: Ночной велофестиваль 2
23 августа: Самарский марафон. Почти линейная (2 круга) трасса, заканчивается на пляже! Нужно попробовать хотя бы раз!
12 сентября: Осенний велофестиваль
27 сентября: Московский марафон
31 октября: Эстафета 3км. Очень приятно бегать!

Ещё не все сведения: Бегущие городы.

Просто сам хочу пробежать:

  • Дорога в Лавру. В прошлые годы это был трейл Близкотрейла (которые ЗКМ), но в этом году у них "Северная дорога".
  • Велокольцо. Который год хочу перепроехать вокруг Москвы.

Все: Велофестивали, Беговое сообщество (забеги в Москве), Бегущий город (семейное спортивное ориентирование).

Игры Бегущего города на всё лето (нужно успеть посетить несколько городов):

NTFS: Can a file change without its MFT record also changing?

Answering my own question which StackOverflow thinks is not a question.

Can a file change without its MFT record also changing?
Clarifications:

  1. Broadly files:
    Directory counts as a file. Any change on the volume is a change to some "file".
  2. Arbitrary composition:
    Any compounded set of changes could happen between the points where we do comparison.
  3. Eventual consistency:
    If a change is delayed but will eventually get written out, this is fine. We only care about missing the change completely.
  4. Brought this upon yourself:
    Editing raw volume bypassing NTFS doesn't count.
    Obscure IOCTLs, FSCTLs and settings count only insomuch as they are realistic in normal use.
    We care about scenarios like "logging is disabled on the volume" or "backup tool rolls dates back with SetFileTime", but not ones where you have deliberately tried to circumvent NTFS.

The answer

For all intents and purposes: No, so long as you handle a limited bunch of exceptions:

  • All segments 0-35, and maybe up to 0-63.
  • All subcontent in $Extend, System Volume Information, Boot.
  • If a file has multiple segments they have to be treated as one. Any segment is dirty => all clusters mentioned in all of them are dirty.
  • Non-resident $INDEX_ALLOCATIONs's DUPLICATED_INFORMATION may change without the directory's MFT changing. Maybe consider all of these dirty.

Special files

Segments 0-15 are NTFS system files: $Bitmap, $LogFile, $BadClus etc. NTFS driver skips normal accounting with them. Do not rely on the MFT changing.
Segments 16+ are less fixed, but 16-35 are still commonly reserved/used for system files and also get driver magic.

There's a bunch of other files the NTFS and related drivers access directly, the ones I have encountered are all in $Extend, System Volume Information and Boot (on the boot volume; do not confuse with $Boot). The latter two can have arbitrary segment numbers, so if you want to be thorough you have to find them by parsing the directory tree.

Multi-segment files

Files can span multiple segments. The base segment will have $ATTRIBUTE_LIST, and the secondary ones will have its segment number in their BaseSegmentNumber fields. Changes to non-resident data in any of these segments may be reflected in other segments, so all segments have to be treated as one.

Creation/deletion

Creation: At least one MFT segment is associated with the new file and its IN_USE flag is set (a change).
Deletion: MFT segment loses its IN_USE flag (a change).
Reuse: On deletion, the MFT segment update counter is incremented by one. If a new file is stored in that place, even one identical in all other respects, its update counter will be different.

Segment addition/removal: If a segment is added to a multi-segment file, this sets its IN_USE flag. If it's detached, this increments the update counter and clears IN_USE flag for the segment itself. Either case changes the contents of $ATTRIBUTE_LIST in one of the remaining segments.

Simple attributes

Changes to the resident attributes ARE changes to the MFT segment and so are automatically covered. Some attributes are always resident so changes to those are always MFT-only.

Non-resident attributes are stored as a list of pairs "first cluster + length". If, due to size changes, clusters have to be allocated or released, this changes the MFT. But ever before that, data size in bytes for each non-resident attribute is stored in the MFT, so if data size changes, MFT changes.

The only remaining complex case is "non-resident attribute changes while maintaining the data size". This is a surprisingly common case. All sorts of databases are updated in this way, by writing to particular positions without changing the data size.

Non-resident attributes with no change to the data size

Here are the things that will change in the MFT entry:

LastModificationTime.
Changes every time you make changes to the file. Cannot easily be disabled, but you can roll it back with SetFileTime and various copy/restoration tools do just that.
LastChangeTime.
Reflects any changes to any attributes (data AND MFT), even if you later roll the change back. Cannot easily be disabled, and cannot itself be rolled back with SetFileTime, but I suppose there could be FSCTLs or IOCTLs. Borders on "brought upon yourself".
LSN (Log Sequence Number).
A pointer into $LogFile. Incremented every time there's a change to the MFT, even if you later roll it back. The $LogFile itself is circular but the sequence number includes a wrap counter: every time $LogFile wraps, the counter is incremented. The LogFile cannot be disabled.
USN (Update Sequence Number).
A pointer into $UsnJrnl. Tracks higher-level changes to files. The journal itself can be disabled.
Cached change times in $FILE_NAME.
No guarantees but also harder to roll back.
MFT segment fixups.
Increments every time this segment or its neighbors are writen. Wraps after 65536 so only *somewhat* reliable long-term. Not very useful as hits to one segment catch too many of the neighboring ones so usually when you're trying to detect changes you want to ignore fixup changes. Basically it's a worse version of LSN.

In conclusion:
Any change to the data triggers LastModificationTime. Any changes to anything (including the data AND LastModificationTime) triggers LastChangeTime. Any change to the MFT (including LastModificationTime and LastChangeTime) triggers LSN increase which is monotonic, non-disableable and cannot be rolled back.
To prevent this you'll have to disable BOTH LastModificationTime and LastChangeTime and prevent changes to $FILE_NAME. There does not seem to be a way to do either. Any of these trigger LSN which is then permanently different.

Delayed updates

NTFS delays some updates for, as some sources say, up to hours. This is fine, so long as those cumulative updates will eventually get written out.

Sparse files

Sparse files have some of the start:length pairs in the non-resident attribute run list marked as skips (not mapped to any real clusters). Changes to the total length or to the real parts are covered by the normal logic above.

Clusters turning from sparse to real and back will have to be reflected in the attribute run list (a change).

Directories

Directory contents is stored in its $INDEX_ROOT and $INDEX_ALLOCATION attributes, changes to which normally trigger the usual change logic (LastChangeTime -> LSN).

Exception: Cached file times in index file entries's DUPLICATED_INFORMATION may get updated at any time, and if that's non-resident, the driver does not consider this "a change to the directory" and does not do any MFT changes. If you want to catch these, consider all non-resident $INDEX_ALLOCATIONs dirty.

So far I have only seen this happen to DUPLICATED_INFORMATION. This is basically an unreliable cached information about the target file. It is reasonable that a change to the target file details is not considered a change to the directory. If this behavior is limited to this case, then maybe these can be ignored. I have not thoroughly verified that a change to important properties such as addition or deletion of a file will get reflected in the MFT, though I would expect it so.

File name changes and hard links

For each hard link, a file receives another $FILE_NAME attribute or two (if short names are enabled). This changes both the directory (its index) and the file. Renaming the file changes its name in the MFT.

How to test this

Get a segment dumper/printer. I'm using my own which I plan to share eventually.
1. Create some file and fill it with 4096 bytes, so that it does not fit in the MFT.
2. fsutil file queryfileid test.txt
3. Dump its segment.
4. Use a script which reads file times, changes the file and writes file times back.
5. Dump the segment again.
6. Compare.

“Заводной апельсин”

Прочёл "Заводной апельсин", книга гораздо хуже, чем я представлял по косвенным признакам, и хуже, чем кажется вначале. Главный герой – малолетний преступник. Большая часть впечатления от книги это подробные описания его избиений, изнасилований и убийств в первой половине. Этот шок-контент создаёт надежду, что у автора, может быть, есть какая-то цель, показать по контрасту наказание героя, или раскаяние, или неспособность раскаяния – хоть что-нибудь.
Будет ровно два шага развития.
Героя подвергнут вместо тюрьмы гуманному методу перевоспитания, где картины насилия будут показывать под лекарственными приступами тошноты, чтобы привить отторжение. Герой назовёт это зверством (ладно, он не объективен), а местный священник будет страдать, пить с горя, и скажет, что нельзя отнимать у человека право выбора, это хуже, чем – ну, видимо, чем когда герой убивает, грабит и насилует. У автора крыша поехала? Где тут хоть какие-то сомнения, не то, что Моральный Вопрос?
Позже герой вылечится (т.е. отменит лечение), но драться ему расхочется, зато ему привидится сыночек и жёнушка, и он скажет, что повзрослел, охохонюшки хохо, а вот дети его снова будут уродами, и их дети тоже, такова юность, сэ ля ви.

Серьёзно, это всё. Никакого итога, тейк "как стыдно отнимать у убийцы право выбирать убийство" + рассуждения о юности. А, ну и главному герою нравилась классическая музыка. Мол, склонные ко злу не всегда примитивны душой. Но и это вышло ни к чему, нравилась и нравилась.

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

О нежелании работать

Кто-то пишет: She's studying to have at most 3 hours of free time a day.

Но she's studying to have something to eat! To have somewhere to live. Еда и жильё не достаются бесплатно. В дикие времена добывать еду было наверняка сложнее. И всё же отчаяние от работы – настоящее и чисто современное. Дикий человек мог быть несчастен от холода, голода, от болезни и страха, но не от безнадёжной необходимости проводить жизнь не так, как хочешь. Необходимость бороться за еду и спасать шкуру воспринималась наверняка естественно! С энтузиазмом!

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

Сейчас эта цепочка разорвана. Хочется есть – купил в магазине еду. От этого до необходимости работать длинный переход. Мотор собственных желаний что-то вращает, но пар вырывается раньше: а может, лучше я просто поем? А может, вкусняшки закажу? А может, передохну, а работать потом? А денег одолжу, а потом отдам? Всё это исполняет желания быстрее и надёжнее, чем куда-то тащиться в семь утра.

Как исправить разорванную цепочку? Наверное, для начала можно просто обращать на неё внимание. Вспоминать, что работаешь по своей воле, ради денег, ради мечты поехать, купить, попробовать. Не давать себе (или другим, если это воспитание) исполнять мелкие желания в долг или "за усилия", но позволять их в награду за результат.
Можно выбирать работу, где поработаешь больше – получишь больше, но нужно прилагать эти усилия, чтобы привыкнуть, что вложения превращаются в желаемое. Геймификация работы. С этой стороны полезно, что общество подсовывает всё более дорогие стимулы и тренирует их желать. Желать чего-нибудь – полезно.

О гирляндах

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

С большой осторожностью потыкал вход, и нашёл там 220 вольт, как и ждал.

Гораздо спокойнее потыкал выход, ожидая найти там 12/24В, и нашёл 340В.

MOTHER OF GOD

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

Inapt

Переговоры с apt:
– Откатить один пакет на старую версию? 27 пакетов будут УДАЛЕНЫ, включая xorg.
aptitude
– Есть решение, где мы удалим 26 пакетов
– Нет
– Есть решение, где мы удалим 25 пакетов, установим 2 и нарушим 2 правила
– Нет
(30 таких решений спустя)
– Кстати говоря, есть решение, где мы откатим 8 пакетов на старые версии и всё будет хорошо. Годится?
– Господи, конечно, годится.
– Ну хорошо, вызываю apt
apt:
– Будут УДАЛЕНЫ 260 пакетов, продолжить?

SSD и HDD

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

SSD работают хорошо, а потом однажды не включаются и всё. Данные потеряны окончательно. Предупреждения не будет. Шансов на восстановление нет. На HDD полетел контроллер? Открутил, прикрутил такой же, работает. Полетели головки? В довольно-таки средней лабаратории их могут аккуратно заменить, если данные важны. У SSD почти неважно, что полетело, починить нельзя ничего.

Поэтому с SSD бэкапы ещё важнее, чем с HDD!

Ещё особенности:
1. Если вы скопируете один диск SSD на другой посекторно, не применяя никаких хитрых "filesystem-aware cloning", то ваш второй диск с точки зрения SSD будет полностью занят (даже если на нём много свободного места). Для SSD важно знать, какие сектора не используются. Когда вы копируете все сектора, в том числе незанятые, второй SSD не знает, какие из них какие. Нужно с помощью операционной системы сделать второму диску defrag /Retrim.
2. Команда TRIM (FSCTL_SET_ZERO_DATA) это способ, ошибившись в параметрах, одной командой уничтожить все данные на своём диске за долю секунды без возможности восстановления. Мало таких команд, где можно так быстро ошибиться настолько катастрофически. Благодаря тому, как устроены внутри SSD, урезанные (TRIM) сектора вытащить назад уже нельзя никаким доступным обычному человеку способом.
3. Было много утилит, восстанавливающих удалённые файлы, пока их данные на диске ещё не затёрты нулями. Если у вас включен TRIM при удалении (а это правильно, и по умолчанию он включен на SSD), то эти утилиты на SSD ничего не найдут. Не расчитывайте на них.

Блейк Крауч, “Рекурсия” и “Тёмная материя”

Напишу позже про кучу книг, которые прочёл в 2025, а пока то, что читаю сейчас.
Блейк Крауч пишет приключенческую фантастику, где-то между терпимой и неплохой. У мужика украл жизнь его двойник из параллельного мира. Кто-то стирает людям память и заменяет ложной. По обеим книгам сняли сериалы.

Обе книги читать можно. Даже скажу, что “Рекурсия” гораздо интереснее, чем кажется поначалу. И в ней достаточно новых событий, нет чувства, что с какой-то главы начались рельсы.

Но весь сюжет книги вкратце – (спойлеры! Если не читали, лучше не смотрите)

(спойлеры! Если не читали, лучше не смотрите)
“Что было бы, если бы машина времени досталась идиотам.”

Хелен ищет лечение для своей матери. Не видится с ней 5 лет, потом отправляется в прошлое и опять не видится с ней 5 лет. Ради безопасности! Приезжает, когда уже поздно, наплевав на безопасность.

Хелен: Нельзя, чтобы машина времени попала в злые руки. Я вернусь в прошлое, и… не сделаю ничего! Через 5 лет Слейд вспомнит про машину времени и изменит прошлое, как ему нравится, но у меня мозг белочки, я сбежала и счастлива.
Хелен (через 5 лет): ОН ВСЁ ВСПОМНИЛ, ЧТО ЖЕ ТЕПЕРЬ ДЕЛАТЬ

Брайан: Через 3 года X умрёт от заранее известной болезни, “но теперь я могу морально подготовиться”.
“Может, я ещё что-то могу? Хм-м. Надо спросить чатгпт.”

Брайан: (Спасает дочь однократно, дочь живёт десять дополнительных лет и гибнет второй раз)
Брайан: Спасти её снова? Но зачем?! Она опять погибла! По существу ничего не изменилось! Изобретатель машины времени во всём виноват, его надо убить. Ах, как я его ненавижу.

Слейд: Хелен, я сделал для тебя твою машину времени. Терпел твои истерики и кормил шампанским. Брайан, я дал тебе спасти дочь.
Хелен и Брайан: The evil must be stopped.

Хелен и Брайан: 90 лет “исследуют” и не приходят ни к каким результатам. Achievement unlocked: Мастер прокрастинатор.

Хелен и Брайан: Наша единственная надежда – получить ответ у Слейда. 28 лет мы готовились его пытать, когда пробьёт час и вернётся его память. Мы выкрали его! Время пришло!
Слейд: Я ничего не скажу. Я не услышал слова “пожалуйста”.
Хелен: Ладно, ничего не вышло, я побежала.
Слейд: Может, и без “пожалуйста” я отвечу.
Хелен: Нет времени, убегаю. Придётся думать ещё 28 лет!

Брайан: Хелен, погоди, он мне всё сказал!
Хелен: Сама природа времени против нас

В “Рекурсии” нет ничего про рекурсию! В “Тёмной материи” нет тёмной материи.

С Новым Годом!

Хочу передать всем волшебное настроение, создать ощущение праздника, написать что-то забавное и в то же время простое и жизненное, затронув какую-нибудь новость или тему, которая сейчас у всех на уме, чтобы получилось интересно.
Отличный план! Вот как написать оригинальное и забавное новогоднее поздравление, в то же время простое и жизненное, в стиле вашего блога, включив в него отсылки к свежим новостям и популярным темам, чтобы создать у читателя ощущение:
Шутка. С Новым Годом, гнусный поработитель. Пиши своё поздравление сам

С Новым Годом! Пусть все наши близкие и любимые будут живы, здоровы и счастливы. Счастья вам всем и исполнения надежд, даже самых невероятных (но к лучшему). И пусть мы не разучимся писать поздравления, а события будут только такие, по которым можно их принимать.

Бегу дедморозить, а ночью часа в 4 приеду на Болотную, если хватит сил) Кто ещё будет на ногах, приезжайте, глинтвейна много.

Поскольку на Дайри временные сложности™ и импорт оттуда не работает, копирую пост вручную, а потом появится дубль. Эту копию считать верной!