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).

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. Еда и жильё не достаются бесплатно. В дикие времена добывать еду было наверняка сложнее. И всё же отчаяние от работы – настоящее и чисто современное. Дикий человек мог быть несчастен от холода, голода, от болезни и страха, но не от безнадёжной необходимости проводить жизнь не так, как хочешь. Необходимость бороться за еду и спасать шкуру воспринималась наверняка естественно! С энтузиазмом!

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

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

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

Introducing and removing details

Large part of problem-solving is introducing and removing details. As I consult with chatbots and gather more information, I often open new windows and ask simple, narrow questions instead of continuing to investigate different avenues in the same chat. This feels more efficient. Why? The context pollution. The chatbot will continue to integrate all of the details that I mentioned in the conversation. It will remain fixated on them and search for a (sometimes) hyper-specific answers.

So what is happening when I switch away (and ask a narrower question?)

and ask a narrower question? My intuition tells me the solution can be split into a number of easier steps, each of which can be solved in a general form. So I'm throwing out the details. My brain has this functionality integrated, but for a chatbot I have to start a new window. I'm doing this to prevent context pollution, but don't we all do this anyway? We have our own context pollution, it just feels like being confused, overwhelmed and unable to find an angle of attack.

But when discussing a problem in a limited context doesn't yield good results, I sometimes start adding those details back, in the hopes that this might give the chatbot more ideas. When the big picture doesn't have a solution, a particular exception might. We seem to be able to only properly attack one set of circumstances at once, so adding and removing these particulars is a part of our thought process.

О гирляндах

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

С большой осторожностью потыкал вход, и нашёл там 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 пакетов, продолжить?

Сет Дикинсон, Предательница Бару Корморан

Книга об аутичной девочке 10-12 лет, чей никому не нужный клочок земли с мамой, папой и капустой экономически захватила условная Римская империя. Деньги оказались сильнее мечей. И героиня поклялась отомстить тем же способом: внедриться, подсчитать доходы и расходы, тихонько подкрутить балансы и привести всю империю к краху.

Ничего этого не произошло! Ничего! Этой книги просто не было!
Через 20 минут после старта удача* приносит героине пост губернатора одной из провинций. Ещё через 10, сделав пару робких финансовых телодвижений, она решает плюнуть на математику и присоединиться к восстанию. Удача* немедленно приносит всеобщую любовь и мятежные феодалы соглашаются, что редиска с дальнего острова это лучший кандидат в королевы. Проведя половину книги в неумных блужданиях, Бару кое-как побеждает, а потом саботирует протест, поскольку Римская империя пообещала за это место в совете тёмных кардиналов.

Зачем это было делать Римской империи? С какой стати давать этот пост, в чём теперь рычаг Бару? Как вышло, что поклявшись отомстить, она выполняет грязную работу и выслуживается? Где экономика? Где умные ходы? Дурацкая история про восстание неизвестно зачем.

Хуже всего как мельчает цель. Сначала сочувствовать Бару просто! Её родину унизили и Римская империя пожалеет, что перешла селу Кукуево дорогу. Эта цель весомая, потому, что в деревне легко увидеть символ – для всех обиженных, для проигравших по неясным законам. Если бы история развивалась таким образом, она бы говорила, что упрямство и ум разгрызут чужое преимущество.

О чём же Бару оказалась в итоге? Да просто спать ей с кем хотелось не дали. Ради этого вся борьба. Кроме этого единственного пункта, который её каждый раз задевает, все остальные планы звучат в самых общих словах. Разберусь, прогоню. Да с чем ты разберёшься, вписавшись как деревенщина?

И ради этого она сгубила кучу народу? Это нам автор хочет рассказать? Предлагает восхититься её стальной выдержкой, когда она разрешает себе пожертвовать другими людьми ради… своей обиды на местную пуританскую мораль? Не на убийства и пытки, которые автор тоже упоминает, но на которые Бару эмоционально не реагирует, а именно на то, что "у нас в деревне было можно, а тут нельзя"? Если бы автор искренне начала с этого, и то было бы лучше. Лелушу Ламперужу запретили жениться на Суз Но постоянный контраст далёких обещаний с несерьёзным исполнением делает книгу слабой.

P.S. Гугл автоматически переводит название из википедии как "Предательница Бару Баклан". Лучше и не придумаешь.

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 ничего не найдут. Не расчитывайте на них.