
Сейчас иные витюберы отчаянно крестятся, вспоминая, что ранее хотели вступить в плотные ряды VShoujo, но как-то не срослось.
Дата рождения: 01.11.1983
Тотальная неудачница и убийца жёстких дисков. Самая большая поклонница Ариэль. Член ордена Вселенского тормоза имени Осаки-сан. Любительница каваййных переднеприводных машинок. Суккуб на полставки. Когти прилагаются.
Сейчас иные витюберы отчаянно крестятся, вспоминая, что ранее хотели вступить в плотные ряды VShoujo, но как-то не срослось.
Тем временем Ксон проснулась, потянулась, запостила в социальную сеть «Твиттер» сообщение, что она счастлива, и тут же оказалась под огнём критики. Твиттерские вопрошают, как она может быть счастлива на фоне коррупционного скандала в агентстве.
Попалось в Твиттере:
Kuberneyney
Попутно выяснила занятное. У функции DeviceIOControl(), которая позволяет давать команды устройствам и получать от них всякие данные (как раз через неё пишутся и читаются данные reparse point), есть такие параметры: входной буфер с размером, выходной буфер с размером, сколько было записано в выходной буфер, ну и ссылка на OVERLAPPED для асинхронной операции. Буферы опциональны в зависимости от устройства и команды, параметр, возвращающий количество записанного, – тоже, ну и OVERLAPPED. Ну, у меня при записи в reparse point операция синхронная и используется только входной буфер, поэтому в функцию передаю только входной буфер и его размер, а всё остальное – NULL. Ну и программа в результате вылетает. Оказалось, что, если параметр, принимающий OVERLAPPED, установлен в NULL, то параметр, принимающий количество записанного в выходной буфер, должен ссылаться на актуальную переменную, даже если выходной буфер – тоже NULL. Оказывается, Microsoft не только не добавила проверку этого параметра, но и использовала его значение где-то внутрях функции, о чём указала в документации. В общем, не делайте так =_=
Короче, написала я прототип программы, которая данные хранит в reparse point. И оно работает: появляется файл длиной ноль байт, который, поскольку система не знает, что это такое, можно только удалить. Написать код, который вытащит эти данные, разумеется, – задача тривиальная, тоесть для маскировки подходит мало, но тут именно что нужно писать код или искать очень специальную утилиту, ибо никакими блокнотами такие файлы не открываются.
А прикольно кидать в Гемини ссылки на видосы и просить сделать саммари. В итоге вместо сорока пяти непрерывных мычаний оратора – сухая выжимка лаконичным текстом, что оратор – идиот.
Подумалось, что все эти криповые истории, когда у человека в квартире предметы меняются местами, мебель двигается, что-то исчезает, что-то появляется, часто – буквально в режиме онлайн, в присутствии человека, а сам человек раз за разом просто пожимает плечами и думает, что ему показалось... В принципе, они не такие уж и нереалистичные.
На нынешней работе я работаю некоторое время, но раз за разом поражаюсь одной штуке. У нас много всяких объектов, физическое присутствие на которых сильно затруднено, поэтому используются всякие средства удалённого доступа для решения проблем пользователей. Регулярно бывает, что обращается человек, обрисовывает проблему, ты говоришь, что починишь, подключаешься и начинаешь решать. И тут начинается вакханалия: мышка начинает ездить, окна закрываются, ты открываешь снова, человек снова закрывает, ты пытаешься что-то делать, человек тебе мешает и тоже пытается куда-то тыкать. Особенно охуенно, когда это делает тот же самый человек, что звонил тебе только что: положил трубку и тут же забыл о разговоре. Перезваниваешь, просишь отойти от компьютера на время, а человек вообще не понимает, что он делает не так: мало того, что проблему не решают, так ещё и мышкой тыкать не дают. Другая ситуация, которая ещё более интересна – это когда в процесс вклинивается кто-то посторонний. Ну, шёл юзер, увидел свободный комп и решил поработать, а человек, который обращался с проблемой, в этот момент отошёл по делам. Либо человек, который обращался, не знал, что за компом кто-то работает, а звонил, что называется, по памяти с дальнего расстояния. И вот представьте себя на месте этого случайного юзера: сидите вы, работаете, и вдруг у вас мышка сама собой начинает ездить что-то открывать, начинает вводиться какой-то текст. Что происходит? Вирус активизировался? Китайские шпионы получили доступ? Полтергей через USB безобразничает? Очевидно, ситуация ненормальная – стоит позвонить специалистам и уточнить, что происходит. Но нет. Человек начинает всё закрывать, потом снова закрывать, потом ещё раз закрывать, борется дёргает мышь, нажимает мимо кнопок и менюшек, пытается работать, игнорируя, как в том меме, происходящее, и так до бесконечности. В крайнем случае может решить, что компьютер сломался, и стыдливо сбежать, оставив следующим коллегам «неисправную» машину. Но обычно борьба продолжается до победного, ну или пока не придёшь на точку и не треснешь пользователя по голове. Вот о чём они думают?
При создании этого мира, я не использовала ничего похожего на ИИ. И лучше вам не знать, что я использовала.
До скрежета зубовного задолбали две категории названий чего бы то ни было:
1. Somethingzilla.
2. Somethingbird.
Похоже, автоматически (разумеется) обновилось приложение тытрубы, и теперь оно не только забывает убирать информационные надписи с экрана (например, «100%»), но ещё и батарею начало жрать с пугающей скоростью. Я мобилу, наверное, раз третий за день заряжаю.
Ещё про обновления. Типичная ситуация:
1. Для программы X выпустили обновление, которое добавляет очень нужных фич и закрывает досадные уязвимости.
2. Обновление закидывается на компьютеры/устройства автоматически в приоритетном порядке и игнорируя любые отключения автообнолений.
3. Оказывается, что в новую версию X вкралась досадная ошибка, которая либо роняет приложение, либо устройство целиком.
4. Разработчик извиняется, уверяет, что постарается так больше не делать, а заодно выпускает инструкцию по решению проблемы.
5. Инструкция сводится к тому, что нужно самостоятельно зайти куда-то и ручками обновить приложение на версию, в которой досадной ошибки нет.
И вот тут у меня каждый раз возникает вопрос: а куда в этот момент испаряются приоритетные автообновления, которые так хорошо обновили приложение ранее? Почему как говнокод заливать пользователю, так всё в полностью автоматическом режиме, а как выгребать этот говнокод, так исключительно ручками?
Говорят, иные японские политики считают, что пора бы Японии обзавестись парочкой ядерных боеголовок на всякий случай, а то мир неспокоен, и Штаты тали какими-то мутными. Интересно, это ещё агитка™ или уже шлангирование™?
You cannot list right after connecting. Please try again later.
Что за фигня на каждом сервере?
https://store.steampowered....54050/The_Black_Ice/
«Догони меня, Топа».
Похоже, кириллические интернеты до сих пор не в курсе, что случилось с шестерёнками, либо находятся на стадии клоунады «Это всё враньё, цензура нам только на пользу, огласите весь список удалённых игр».
А я поняла, почему размеры не совпадают. При чём, как оказалось, не только в WSL симлинках, но и в других симлинках (собственно, симлинках и junctions). Началось с того, что я нашла баг в билиотеке, где передавался неправильный размер буфера, и сломалось всё. Код показывал, что в заголовке данных размер буфера с путями такой, а на деле – другой, поменьше. Оказалось, что это поле в заголовке показывает кое-что другое. Там есть структура REPARSE_DATA_BUFFER, которая универсальная для всех майкрософтовских reparse points. У всех у них первые восемь байт имеют одинаковый смысл, а дальше уже могут быть как дополнительные данные, так и дополнительные поля, которые эти данные описывают. Полей может быть разное количество. Так вот, поле, которое указывает размер данных, указывает этот размер после общего заголовка, тоесть вместе со всеми дополнительными полями. А я считала без учёта дополнительных заголовков, ну и получалось, что фактически данных меньше, чем в заголовке. При чём в описании этих заголовков именно это и было написано, но я читала невнимательно =_=
Добавила в свою библиотеку парсинг симлинков WSL. Оказалось, что Cygwin создаёт их как-то странно: в заголовке данных симлинка есть поле, которое указывает размер части, которая идёт после заголовка и содержит путь к объекту, на который указывает симлинк (в UTF-8, кстати). И вот это значение почему-то всегда на четыре больше, чем там есть по факту. Почему – БП. Надо попытаться ещё с самим WSL поэкспериментировать. Кроме того, сами данные там в очень свободной форме. Если у обычного симлинка есть флаг, относительный там путь или абсолютный, то тут может быть всё, что угодно, и оно даже может не совпадать с тем, что передано команде ln. Передала «0000» – получила «0000». Передала «/cygdrive/x/0000» – получила «/mnt/x/0000». Передала «X:\0000» – «X:\0000».
Я это всё к чему? У нас есть ещё Cygwin, у которого есть своя ln. И вот как раз она создаёт натуральные reparse points, которые видятся как reparse point. DIR показывает их как «JUNCTION», FAR3 – как «LX_SYM», Проводник (в Windows 7 и ниже) вообще показывает это как файл, а Link Shell Extension не воспринимает как симлинк. И никто не умеет с этим работать. А на деле у данной штуки «тэг» – IO_REPARSE_TAG_LX_SYMLINK, тоесть симлинк, который поддерживается WSL. Возможно, в Десятке в Проводнике он выглядит лучше, но я не видела. Надо экспериментировать.
В линупсе, при создании симлинков на NTFS разделах, создаются нормальные на первый взгляд симлинки. Но после перезагрузки они превращаются в тыкву в виде файла с атрибутом «Системный», с заголовком «IntxLNK» и каким-то данными после Chr(1). Оказалось, что это какое-то легаси, которое должно работать и в винде, но не через нормальные reparse points, а через какое-то дополнительное ПО, обеспечивающее совместимость с POSIX или типа того (кажется, речь идёт не про подсистему). Короче, в живую я это ПО не видела, так что не в курсе. Что интересно, MINGW32 тоже создаёт такие файлы, но при этом правильно парсит их, ls показывает их как симлинки, ну и входящие в комплект программы тоже работают с ними, как с симлинками. Просто интересное наблюдение.