Кодерская мастерская
137 subscribers
1 photo
14 files
39 links
Блог Данила Пылаева
Download Telegram
Модификация прошивки роутера D-Link DIR-822

Под новый год я решил упороться и прошить роутер от MTS, а сейчас победил лень и описал это в немаленьком таком лонгриде.
Формат получился необычным, текст содержит кучу вставок блоков кода и цитат / копипаста уже написанного ранее, и надеюсь в таком виде оформлять посты мне больше не придётся, так как это достаточно сложно и муторно.

Постом выше я писал про две части.

Но что-то пошло не так, и их получилось 3.

Технически, думаю, можно было и в две запихнуть, но логически контент поделить не получалось.

Первая часть,
Вторая часть,
Третья часть.

UPD: на Android есть проблемы с доступностью некоторых элементов текста, лучше открывайте в браузере (сначала обычный Instant view просмотр внутри приложения, а потом кнопка Ещё (так называемые три точки), и там в меню можно открыть сторонним приложением).

#ХакВоБлаго
Перерождение Survive the Wild

Многим известна игра Survive the Wild, которую последние года полтора Sam Tupy (главный разработчик и, насколько мне известно, единственный программист в команде) допиливал, пытаясь устранить некоторые глобальные проблемы.

В итоге им было решено вообще сменить язык программирования, да и вообще стек разработки.

Я слежу за изменениями в проектах Сэма, кажется, ещё с осени 21-го года, когда вернулся в stw.

Лично мне интересно наблюдать за развитием навыков и возможностей человека, начинал который с bgt (по крайней мере известные его проекты написаны на этом ЯП), а сейчас освоил git, базы данных, администрирование linux на некотором уровне, и вроде даже C++ и Python.

В феврале на сервере игры навернулся SSD, с восстановлением данных возникли некоторые траблы (ага, он не делал бэкапы! Точнее делал, вроде бы, раз в месяц, и в итоге последний бэкап до выхода диска из строя выполнялся за три недели до инцидента), после этого игру было решено не восстанавливать, пока кодовая база не будет переведена на новый ЯП, и не будут внесены некоторые нововведения (цельная карта, относительно умные животные, система багрепортов и т.п.).

И вот сегодня на 15:14 по МСК запланировано открытие публичной беты, куда я предлагаю сходить всем, кому это интересно, и поискать там весёлых багов, а они там будут по-любому.

Вот
ссылка на последний пост по состоянию stw.

#Игры
Ностальгический видос

На днях листал ленту в Youtube, и мне попалось видео со следующим названием: "ЗЕМЛЯНКА ИЗ ШЕСТИ БРЕВЕН НА СКЛОНЕ ГОРЫ - ЯМА, КАРКАС, ГЛИНЯНАЯ ПЕЧЬ и ЛЕС - ВЫЖИТЬ ПОД ЗЕМЛЕЙ!".

И т.к. я люблю видосы про крафт, решил его глянуть, и сделал это не зря.

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

В общем если хотите отвлечься и расслабиться, рекомендую к просмотру, наверное лучше смотреть перед сном, главное в процессе не уснуть, что, кстати, в моём случае чуть не произошло 🙂

https://www.youtube.com/watch?v=hqqNYDXSEjg
Яндекс диск свернул куда-то не туда

Прислал мне как-то яндекс практикум анонс вебинара по английскому, я зарегистрировался, думая что они будут стримить на youtube.

Когда время вебинара пришло оказалось, что стримить на youtube они не будут, в зуме я смотреть не хотел, и в итоге забил.

И вот сегодня они прислали запись. "Ладно, послушаю в записи" - подумал я.

Ссылка на яндекс диск, открываю, попадаю, как я понял, в папку с единственным mp4 файлом, и...

Пытаюсь найти кнопку "Скачать".

Не нахожу, изучаю всю страницу, не нахожу контрола для скачивания (ни кнопок, ни ссылок).

Тыкался в режиме обзора и редактирования, эмулировал левый и правый клик куда можно и нельзя, всё тоже самое с отключенным блокировщиком рекламы.

Спустя 5 минут, неожиданно, начал открываться плеер при нажатии Enter на файле в режиме редактирования (иначе никак не открывается).

Круто, ща из плеера скачаю!

Вот значит кнопочки для управления воспроизведением, ползунки, настройки, кнопочка "Ещё"...

Тыкаем, а там только инфу о файле предлагают посмотреть.

Кручу-верчу плеер ещё пару минут, и делаю то, чего вообще пользователь облачного сервиса не должен делать, он даже думать об этом не должен, но мне вот пришлось.

Открываю DevTools, перехожу на вкладку Network, немножко магии, и дрррааассти, master-playlist.m3u8, попался!

Копируем здорровый урл, запихиваем в yt-dlp и получаем желанный видос, если ещё не забыли, с яндекс диска.

Вот такие вот чудеса, я, разумеется, не исключаю вероятность своего рукожопства, вот вам ссылка, попробуйте скачать сами и если получится, расскажите об этом в комментах, хоть буду знать, как с яндекс диска нынче качать надо 🙂

https://disk.yandex.ru/d/r7fiuUWtEUSz8g

#ОноСломалось #ХакВоБлаго
speechFilter-0.1.nvda-addon
7.6 KB
Speech Filter

Долгое время я испытывал негативные эмоции в следующем сценарии:
1. В NVDA каким-то образом попадает куча текста, например 100000 символов.
2. NVDA добросовестно передаёт эту кучу текста на синтезатор.
3. Синтезатор пытается её сожрать, офигевает, зависает и намертво глушит NVDA.

В таком случае, частенько, ждать бесполезно, и проще перезапустить NVDA, но это тоже не всегда удаётся, т.к. NVDA перехватывает нажатия клавиш, не может их обработать т.к. висит, и не пускает их дальше всё по той же причине.

Вроде несколько версий назад эту проблему попытались решить, но иногда такие жёсткие фризы всё равно проскакивают, и тогда только либо помощь зрячего, либо танцы с бубном из под alt+ctrl+del.

И для решения этой проблемы я написал простенькое, но, на мой взгляд, очень полезное дополнение, которое отфильтровывает длинные последовательности текста, не пропуская их на синтезатор.

Возможно, кстати, какие-то синты от этого не глохнут, но как минимум у eSpeak такое поведение наблюдается.
👍1
Рандом в Unix

В линуксе для получения случайных (ну или псевдослучайных) байтов имеется два файла, /dev/random и /dev/urandom.

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

А проблема заключалась в том, что я постоянно забывал какой файл для чего используется, и пытался считать много байтов из более надёжного источника, получая замечательные фризы.

Но однажды я решил немножко погуглить, и узнал один простой факт, благодаря которому я с того момента ещё ни разу не перепутал эти файлы.

urandom так называется потому что, внезапно, unlimited random!
Да, буковка u означает unlimited, т.е. не ограниченный.

Ну а просто random, соответственно, ограниченный, т.е. замораживающийся при исчерпании накопленной энтропии.
🥰1
Кодерская мастерская
Смена пароля в "Яндекс 360" Чтобы сменить пароль в "Яндекс 360" нужно сделать следующее: 1. Зайти на адрес admin.yandex.ru. 2. Найти заголовок "Сотрудники". 3. Под заголовком найти нужного сотрудника и нажать на него. 4. Найти в нижней части страницы информацию…
Смена пароля в "Яндекс 360" V 2

Около года назад я уже описывал увлекательную процедуру смены пароля сотрудника в yandex 360, и сегодня мне снова пришлось это делать, а, стало быть, можно повторить.

И не потому что почему бы и нет, а потому что эта процедура немного изменилась, и, соответственно, прошлогодняя инструкция устарела.

Чтобы сменить пароль в "Яндекс 360" нужно сделать следующее:
1. Зайти на адрес admin.yandex.ru.
2. Найти заголовок "Сотрудники".
3. Под заголовком найти таблицу с сотрудниками.
4. Найти строку нужного сотрудника и переместиться в шестой столбец.
5. Нажать на кликабельный элемент.
6. Элемент в шестом столбце должен преобразоваться в кнопку, нужно снова нажать на неё.
7. Под таблицей появится меню с возможными действиями.
8. Для смены пароля нужно найти соответствующее действие и активировать его.
9. Должен открыться диалог смены пароля, в котором будет находиться искомая вами форма.

#A11yTricks
Машинный перевод

Некоторое время назад я, читая про раздачу интернета с телефона на Windows оказался на странице статьи, описывающей реализацию RNDIS (универсальных драйверов для этой самой раздачи).

Как водится, статья эта открылась на русском языке, и её перевод, как и положено, был выполнен не человеком.

Наверное многим знаком перевод некой инструкции от Microsoft, в котором предлагалось казнить монтажника изображением подноса. Так вот в той статье я нашёл конструкции, которые могут посоревноваться с тем переводом по упоротости.

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

1. "Корпорация Майкрософт предоставляет драйвер мини-порта NDIS, Rndismp.sys, который реализует набор сообщений удаленного NDIS и взаимодействует с универсальными водителями автобусного транспорта, которые, в свою очередь, взаимодействуют с соответствующим водителем автобуса. Этот драйвер мини-порта NDIS реализуется и поддерживается корпорацией Майкрософт и распространяется в составе Windows."

2. "Корпорация Майкрософт также предоставляет драйвер транспорта автобуса USB, который реализует механизм для передачи сообщений удаленной NDIS через USB-шину. Этот драйвер транспортирует стандартизированные сообщения удаленного NDIS между драйвером мини-порта Remote NDIS и конкретным драйвером автобуса, например USB. Водители, относящиеся к автобусу, также обязаны сопоставлять любые требования к шине, такие как управление питанием, в стандартизированные сообщения удаленного NDIS."
👍1🔥1
Проблемы со временем

Почему-то так получается, что я постоянно встречаюсь с проблемами синхронизации времени, началось это всё ещё в детстве, и продолжается до сих пор.

Лет 10 назад у меня были говорящие часы, такая коробочка примерно 8 на 8 на 7 см, которая офигенно быстро убегала вперёд, за месяц набиралось около четырёх минут.

Ну это ладно, вероятно, там просто самые всратые часы реального времени, какие получилось найти у разработчиков, тут вроде всё понятно.

Чуть позже у меня появился компьютер с windows, на котором через пару недель использования стало отваливаться время. Оказалось, что села батарейка RTC, после её замены всё стало хорошо.

Прошло ещё несколько лет, и я стал обладателем телефона с Talkback-ом на борту (да, комп освоил раньше телефона, и такое бывает).

И с телефоном тоже были приколы: прыгал часовой пояс, решилась эта проблема выключением синхронизации часового пояса, и на какое-то время всё стало хорошо.

А тем временем наступил 2023, и винда решила упороться.

Работаю я за компом, никакие настройки времени в винде не трогал уже несколько месяцев, и тут вдруг выясняется, что в 10 утра винда показывает полпятого, причём совсем рандомно, без привязки к какому-то часовому поясу.

Ладно, синхронизировал, прошла пара месяцев, и что-то вдруг посыпалось, вроде браузер не смог верифицировать ssl.

Проверил время, И действительно, оно снова улетело, на этот раз вперёд, и уже почти на сутки. Причём это произошло месяца через полтора после посещения СЦ, где поменяли полумёртвый вентилятор системы охлаждения, и заодно освежили батарейку RTC.

Но самое увлекательное было впереди, наступило лето 23-го.

Лежу я на солнышке, загораю, видосик смотрю, тут кто-то в телегу написал, и так получилось, что как раз в это время я открыл шторку, а там...

Там уведомление от телеги через 2 минуты, прям вот так и написано.

Может не в точности так, но смысл такой, что пришло уведомление из будущего.

Проверяю телегу, и там действительно сообщение минуты на 2-3 позже, чем текущее системное время, что меня сильно удивило, т.к. вроде синхронизация по сети включена, и не должно быть таких жёстких смещений.

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

Такая же история со смещением назад произошла через несколько недель, а потом ещё одна...

В итоге я выяснил, что на самом деле телефон не синхронизирует время через интернет, как я всегда думал.

Он синхронизирует время по телефонным вышкам, на которых, как раз, оно может быть не очень точным (хз, почему в 2023 на таком оборудовании время имеет такие проблемы с точностью, но вот оно так, и остаётся жить с этим).

Временным решением стало выключение синхронизации времени, но часы в телефоне, как выяснилось, потихоньку убегают вперёд, поэтому так всё оставлять было нельзя.

И решение то я нашёл, установил ClockSync, который синхронизирует время по NTP, но вот только чтобы менять системное время нужен root, который у меня есть, но как же быть пользователям без таких привилегий?..

И на этом, разумеется, ничего не закончилось, пару недель назад я переустановил систему на сервере, поменяв девятый debian на 22-ю ubuntu, и угадайте, что произошло?

Получая сообщения от всяких сервисов я заметил, что приходят они раньше положенного, например сообщение, которое должно приходить в начале часо (т.е. в 0 минут), могло приходить в 59 минут.

Пошёл смотреть чего там с timedatectl, а там написано: System clock synchronized: no.

Стал разбираться, выяснил, что не работает systemd-timesyncd - сервис синхронизации по ntp, за 20 минут гугления ничего больше понять я не смог, и решил просто наугад задать ntp-сервер.

И знаете, это сработало! Я просто нагуглил какой-то рандомный ntp-сервер, задал его в конфиге, перезапустил службу, и оно сразу завелось!

Почему в дистрибутиве почти свежей ОС, причём ОС, которая более-менее должна быть дружелюбна к пользователю, нельзя было настроить ntp из коробки?..

В общем вот такая вот дичь порой происходит, и, скорее всего, этот случай далеко не последний.
Спам от Литрес

Литресом я не пользуюсь, но сейчас понадобилось зайти, и решил я заодно отключить уведомления от них.

Зашёл на страницу настроек, а там с доступностью флажков большая беда: нет ни состояний, ни ролей.

Ну что же, полез в исходный код, кручу-верчу DOM-дерево, пытаюсь понять, что там и как.
И натыкаюсь на контейнер, в который вложены все флажки, а выглядит он следующим образом:

<div class="Spam__checkboxes_3kJh8">...


Да, в классе элемента прямым текстом написано, за что, на самом деле, отвечают сие флажки, вот такой вот прикол от разработчиков.
👍2
Разрушительный сбой

NVDA, как некоторым известно, порой выдаёт всякие весёлые ошибки, которые просто происходят, и частенько даже не влияют на работоспособность nvda.

Видал я от неё всякое, но такое случилось со мной впервые.

Сначала быстро открылось и закрылось cmd-шное окно, в последнее время винда после установки обновлений любит таким баловаться, ничего необычного, я уже даже почти привык.

Потом, практически сразу, nvda блямкнула ошибкой, и я, как любопытный юзер, разумеется полез в журнал.

А там...

_ctypes.COMError: (-2147418113, 'Разрушительный сбой', (None, None, None, 0, None))


Что это было и какого вообще фига я не знаю, но выглядело настолько круто и грозно, что я хорошенько поржал.
errorSound-0.3.nvda-addon
4.3 KB
Error Sound

Это дополнение для NVDA позволяет включать или выключать воспроизведение звука ошибки независимо от настроек и версии.

Например, вы можете выключить воспроизведение звука ошибок в альфа-версии, или включить его в релизе.
Вечный двигатель в Eurofly3

Относительно недавно вышла в свет бета-версия игры Eurofly3, в которой значительно переделали многие механики, повысили реалистичность, добавили новых фишек и всё в таком духе.

Одна из возможностей - это заправка самолёта, она, конечно, была и во второй версии, но в третьей с ней, на данный момент (2024-02-08 22:00 по мск) имеется презабавнейший баг.

Если убрать парковочный тормоз и в поле для ввода кол-ва топлива указать большое отрицательное значение (минус несколько десятков тысяч), то самолёт начнёт разгоняться с выключенными двигателями.

Взлететь, кажется, так не получится, т.к. он думает, что садится, и сразу после отрыва приземляется или разбивается, но если взлететь нормально, а потом заправиться отрицательным количеством топлива в воздухе, то лететь можно будет, наверное очень долго, постепенно набирая скорость.

Кстати да, заправка в небе тоже возможно, такая вот бета...
Если же подобрать скорость так, чтобы приблизить массу самолёта к нулевой (для стартовой Цесны это около -1500 литров), то начнётся лютое веселье, самолёт за пару секунд наберёт скорость в несколько миллионов, потом провалится в -2147483648 и уедет куда-то в далёкие дали, а если это сделать в полёте, то географические координаты станут либо бесконечными, либо начнут отображаться как NaN (не число).

Не знаю, зачем вам эта информация, но лично меня всегда веселят такие баги, когда что-то начинает работать странно, удивительно, и совсем не так, как предполагал разработчик продукта. В общем может кому-то это тоже будет интересно.
👍1
Вирус для BIOS. Бред или реальность?

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

Я отношусь к этому скептически, но допускаю, что какой-то небольшой процент плат действительно можно было прям вот так из ОС угробить, но скорее всего нет.

В любом случае, сейчас у нас UEFI, безопасная загрузка, проверка подписей на каждом шагу и вот это вот всё. И все эти приколы со взломом биоса, как я думал, остались в прошлом.

Начну с небольшой предыстории. Вчера на мой ноут из центра обновлений пришёл апдейт биоса, ну пришёл и пришёл, что-нибудь пофиксили наверное, но ради интереса я решил заглянуть на сайт производителя и узнать, что именно завезли в новой версии.

Примечание к апдейту оказалось довольно кратким: "Update the patch for the LogoFAIL vulnerabilities".

Что перевести можно примерно так: "Обновлён патч для уязвимостей LogoFAIL."

Сам факт наличия уязвимости в UEFI меня слегка удивил, да и название показалось немного странным, поэтому я решил погуглить.

А нагуглил я неожиданно для себя следующее: оказывается, в конце 23-го года, некие исследователи нашли способ обойти безопасную загрузку и Intel Boot Guard, и сделали это не на уровне ОС, а на уровне UEFI.

А виноваты в уязвимости, как это часто бывает и как можно догадаться из названия, обыкновенные картинки, ну точнее не обыкновенные, а намеренно испорченные особым образом, и не сами картинки, а парсеры картинок, встроенные в UEFI.

Вкратце уязвимость заключается в следующем:
1. UEFI при запуске выводит на экран логотип производителя, который на некоторых платах возможно заменить на кастомный.
Атакующий подкладывает заранее подготовленную картинку в EFI раздел и прописывает в NVRAM некие переменные для замены стартового изображения.
Для этих действий внутри windows достаточно обычных прав администратора, которые мы часто выдаём приложениям не задумываясь.

2. При следующем запуске компьютера, UEFI, основываясь на инструкциях по замене логотипа, прописанных в NVRAM, вычитывает заражённое изображение и передаёт его парсеру.

3. Парсер спотыкается об некорректные данные, происходит переполнение буфера, которое позволяет записать в память, а затем и выполнить произвольный код, который может сделать всё что угодно с наивысшими привилегиями.

Железо так испортить, наверное, не получится, но вот залезть внутрь ОС и натворить там шпионских / деньговымогательских дел - почему бы и нет.
А учитывая, что эта штука, как я понял, прописывается в сам UEFI и выживает после переустановки ОС, потенциал уязвимость имеет немаленький.

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

Почитать про уязвимость подробнее (на английском) можно здесь: https://binarly.io/posts/finding_logofail_the_dangers_of_image_parsing_during_system_boot/index.html
Проблема доверия языковым моделям (часть 2)

Где-то выше был длинный пост в телеграфе который никто не стал читать 🙂, в котором я рассказывал про проблемы слепого доверия языковым моделям.

В том посте я спрашивал у ГПТ про особенности синхронных и асинхронных менеджеров в python, и он там нёс лютую дичь.

Этот же пост будет чуть-чуть о другом: как реально можно использовать ГПТ для упрощения жизни.

В процессе написания некоторого софта я столкнулся с проблемой, и вот кто давно в программировании наверное поймёт, что я имею в виду.
1. Есть какой-то абстрактный поток операций.
2. С ним что-то не так, например его выполнение не приводит к нужному результату, или, как в моём случае, всё вроде ок, но сам код громоздкий / хрупкий / некрасивый.
3. В голову приходит мысль - загуглить это дерьмо.
4. "How to ...".
5. "Why ...".
6. "Best way to...".
7. Вот же дичь, как это загуглить вообще?!

И тут я решил просто спросить у ГПТ.
---
Я пишу программу на python, в ней часто встречается подобный код

active_contexts = {}
def handle_context_wrapper(context):
active_context = active_contexts.setdefault(context.id, {'counter': 0})
active_context['counter'] += 1
handle_context(context)
active_context['counter'] -= 1
if active_context['counter'] == 0:
active_contexts.pop(context.id)


Существует ли какое-то готовое решение для подсчёта таких ссылок?
Мне особенно не нравится, что я должен отслеживать 0 и удалять объект из словаря, чтобы избежать утечки памяти.
---
На самом деле во всём этом посте в целом и в вопросе в частности есть один подвох, но о нём чуть позже.

Вот задал я этот вопрос гпт, ну и вы, если шарите за код, в общем-то тоже можете подумать и отписать в комменты.

А ГПТ дал мне такой ответ (прямая цитата).
---
Для более удобного управления подобными ссылками в Python можно воспользоваться модулем weakref. Weak references предоставляют способ создать ссылку на объект, не удерживая его в памяти. Это позволит автоматически удалить объект из словаря, когда на него перестанут ссылаются другие объекты.

Пример использования weak references для вашего случая:

import weakref

active_contexts = weakref.WeakValueDictionary()

def handle_context_wrapper(context):
active_context = active_contexts.setdefault(context.id, {'counter': 0})
active_context['counter'] += 1
handle_context(context)
active_context['counter'] -= 1

Теперь вам не нужно реализовывать проверку на значение счетчика и удаление объекта из словаря, так как weak references автоматически удалят объект после его удаления из всех strong ссылок.

Надеюсь, это поможет вам упростить ваш код и избежать утечек памяти.
---
И ведь действительно, это то, что мне было нужно!
Особенно если учесть, что в моём коде есть ещё и обработка исключений, которой я не стал грузить гпт, но мне при выполнении этой самой обработки тоже нужно делать декремент и проверку на 0.
Но в любом случае, weak references решают и эту проблему!

И разумеется, только получив ответ, я тут же побежал переписывать свой код, восхваляя великий и могучий ChatGPT, который так идеально решил мою...

Нет-нет, я не совсем ещё деградировал, поэтому первым делом я побежал курить мануал по модулю weakref, и выкурил одну интересную штуку.
Кодерская мастерская
Проблема доверия языковым моделям (часть 2) Где-то выше был длинный пост в телеграфе который никто не стал читать 🙂, в котором я рассказывал про проблемы слепого доверия языковым моделям. В том посте я спрашивал у ГПТ про особенности синхронных и асинхронных…
Подвох первый: на словарь создать weak reference невозможно!!!
Вот это самое место, сгенеренное гпт: active_context = active_contexts.setdefault(context.id, {'counter': 0}).

Так вот если просто взять этот код и попробовать выполнить, мы получим ошибку: TypeError: cannot create weak reference to 'dict' object
Решение то простое, переопределить класс словаря пустым подклассом, например так:

class Dict(dict):
pass


Нет, это не первоапрельская шутка, это реальный пример из документации, и оно кстати работает, при использовании такого словаря библиотека на него не ругается.
Но итог так или иначе один: никогда такого не было и вот опять, гпт сгенерил нерабочий код.
И, соответственно, вывод такой же, как и всегда, ВСЮ инфу, получаемую из модели, нужно перепроверять.

Это был первый подвох, но остался ещё один, скрывается он в этой строке моего вопроса к ГПТ.
"Существует ли какое-то готовое решение для подсчёта таких ссылок?"
Да, всё верно, в вопросе заложено больше половины ответа, что, кажется, и позволило ГПТ легко и просто выдать нужную мне инфу.
Каким-то образом, видимо, сработал мой мозг, чуть ли не с уровня подсознания вытащив подсказку про ссылки, и вобход сознания передал её руками на клавиатуру, потому что сам я это понял только уже написав две трети поста, ну и не выкидывать же теперь...
Попытка получить похожий ответ, убрав упоминание ссылок, закончилась провалом, сначала он стал советовать мне threading.local, потом contextvars, потом дикораторы и контекстные менеджеры, на которых благополучно и зациклился.
Но несмотря на всё это, проблему то я действительно решил, над запросом в google я думал бы ещё долго, а тут сразу готовый ответ.
И нельзя не учитывать, что это была всего лишь гпт 3.5, и возможно четвёртая справилась бы и без такой наводящей подсказки.
Госуслуги взвешивают файлы

Наверное всем знакомо своеобразное речевое упрощение, которое, вероятно, возникло потому, что так просто короче и удобнее.
Я имею в виду фразы по типу "файл весит 5 гигов", "Программа много весит", "тяжёлый архив" и т.п.
Это ведь короче, чем "Размер файла 5 гигабайт" или "архив имеет большой размер".
Кто-то даже идёт дальше, и вместо мегабайт использует слово метры, мне в такие моменты представляется улица, вдоль которой протянута уходящая за горизонт лента, примерно как в аудиокассете.
Я в целом не имею ничего против такого жаргона, и сам его порой использую, но исключительно в разговорной речи или неформальных переписках.
Но вроде всем очевидно, что такие формулировки не должны использоваться в серьёзных текстах, сообщениях интерфейса, письмах и т.п.
Однако оказалось, что кто-то считает иначе.

Родственники попросили меня сделать выписку из ЕГРН через госуслуги, потому что у них чё-то там не получилось, не нажалось, и вообще у них лапки 🙂

ЕГРН - это Единый государственный реестр недвижимости, из которого нужно было сделать выписку по этой самой недвижимости.
Выписка представляет собой электронный pdf-документ, который пользователь скачивает в личном кабинете и использует дальше для своих нужд.
Так вот когда я сделал выписку и полез в ЛК её скачивать, увидел ссылку со следующим текстом:
"файл с изображением Онлайн-выписка помещение весом 0,2 Мб Скачать ,Кнопка"

И в этом тексте прекрасно всё.
Как мне кажется, он просто пронизан по**измом человека, который пилил доступность этого элемента управления.
Начнём с конца. В конце у нас написано "Скачать ,Кнопка", именно так "Скачать", пробел, запятая, "Кнопка".
А написано это всё кстати в атрибуте aria-label, который добавлен к ссылке.
Теперь вернёмся в начало, там написано "файл с изображением", тут вообще непонятно, что имелось в виду, скорее всего это значит, что скачаем мы pdf, но возможно я ошибаюсь...
Далее следует просто через пробел, без кавычек, без запятых: "Онлайн-выписка помещение весом 0,2 Мб".
И разумеется сначала я так и подумал, что помещение весит 0,2 мб, не понял конечно как это может быть, но подумал.
И только секунды через 3 до меня дошло, что 0,2 мб весит файл, после чего я протупил ещё пару секунд, проверил адресную строку, предположив, что может я каким-то образом попал на фишинг, потом протупил ещё немного и наконец принял тот факт, что прям вот так написано на сайте госуслуг.
И как бы фиг с тем, что на ссылке написано кнопка, и что доступность по-хорошему так не делается, но использовать термин "вес" вместо "размер" - это прям очень странно, и как-то вообще не к месту.
Тут у меня теории две.
1. Человеку было настолько пофиг, что он писал - что в голову придёт.
2. Человек посчитал, что слепые - это лохи, которые фразу "файл размером 0,2 мб" не осилят, поэтому на своё усмотрение упростил её.

Но, с другой стороны, из этой истории можно сделать и позитивный вывод:
Они пилят доступность госуслуг!
Да, местами кривую, с названиями типов элементов на самих элементах, без пунктуации или даже с опечатками, но всё же делают.
🔥2😁1