Кодерская мастерская
137 subscribers
1 photo
14 files
39 links
Блог Данила Пылаева
Download Telegram
Мне приснилась Джанга для девопсов:
2 или более участников логинятся на сервак, и по очереди выбивают процессы, кто уронил систему, тот проиграл.

Теперь мне непонятно одно: я это где-то прочитал и забыл, или на самом деле подсознание с нуля сгенерировало?..
👍2🔥1🤣1
Производители ноутбуков придумывают красивые и удобные страницы загрузки драйверов, кладут к ним специально написанные инсталляторы, которые проводят пользователя по всем шагам, сами поднимают привилегии до админа, сами предлагают перезагрузить винду и тому подобное.
Тем временем Infinix:
cd /d "%~dp0"

pnputil /add-driver *.inf /subdirs /install

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

PS:
Это всё не хорошо и не плохо, просто мне показалось интересным, главное, что дрова можно найти и скачать без танцев с бубном, в случае с каким нибудь чуви, например, всё гораздо веселее.
Установка Ubuntu через интернет

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

Для чего это нужно?
Во-первых, в серверной убунте отсутствует скринридер из коробки, поэтому вслепую, традиционными методами её не поставить.
Можно вместо серверной ставить десктопную, но она заметно больше, и для некоторых сборок с малым размером хранилища это может быть критично.
Чистить систему от лишних пакетов после установки можно, но удовольствие сомнительное.
Во-вторых, Этот способ полезен, если нужно установить систему на машину без монитора и/или динамиков, тут даже наличие скринридера не поможет.

Почему ubuntu?
Лично я привык к этой системе, она кажется мне более дружественной и удобной по сравнению с debian, другие дистрибутивы не пробовал, я то ли слижком молод, то ли слижком стар для этого.
Также в ней встроен инструмент cloudinit, с помощью которого и производится сетевая установка, насчёт других дистрибутивов не в курсе, ибо ubuntu для меня - как раз то что нужно, и дальше я эту тему не стал исследовать.

В создании данного материала принимал широко известный в узких кругах Бека (aka Gozaltech), за что ему большое спасибо.
Бека слишком ле... слишком занят для того, чтобы выплёскивать в интернет тысячи буковок, поэтому пост пишется и публикуется мной, а Бека потом репостнёт его к себе.
Кстати можете подписаться на его канал, направленность техническая, посты выходят достаточно редко, выкладываются аддоны для nvda, различные продукты для android и т.п.

И так краткий обзор:
1. В инсталлятор серверной ubuntu подкладывается конфиг.
2. Ubuntu стартует, cloudinit вычитывает конфиг и поднимает ssh-сервер.
3. При подключении к ssh открывается псевдографический интерфейс, из которого можно выполнить установку системы или произвести восстановительные операции.

Выглядит просто, но на деле есть несколько нюансов:
1. cloudinit может не прочитать конфиг, если он неправильно передан.
2. ssh может неправильно сконфигурироваться.
3. Ну и самое главное, есть тысяча и одна причина, по которой может не подняться интернет.

То есть я опишу, что сработало у меня, но не факт, что вы сможете повторить с первого раза на своём оборудовании.
Начну с того, что никакого wi-fi, даже не думайте об этом.
Дело в том, что как-минимум нельзя заставить cloudinit поднять первый попавшийся wlan интерфейс, нужно точно знать его имя.
Может есть какая-то методика, по которой реально определить имя адаптера, у ядра ведь есть некие правила именования устройств, но в эту тему я не погружался, потому что помимо того, что нужно знать имя интерфейса, так ещё далеко не факт, что система в принципе умеет работать с вашим адаптером.
Или более новая, например ubuntu 24.04, будет видеть адаптер, а 22-я уже не будет, в моём случае так и было.
Поэтому тему подключения по wi-fi я не рассматриваю, только через ethernet, ну и будет бонусная часть для извращенцев с подключением через телефон, выступающий в роли модема.
Кодерская мастерская
Установка Ubuntu через интернет В этом гайде рассмотрен процесс установки ОС Ubuntu через интернет, подразумевается, что для повторения ниже описанного вы должны что-то понимать в линуксе и устройстве интернета. Для чего это нужно? Во-первых, в серверной…
Часть первая: самый простой и тривиальный кейс установки.
Имеется некая headless машина, на которую нужно установить серверную убунту, машина подключена к маршрутизатору патчкордом, ей выдаётся статический адрес.
Статика не обязательна, но лучше, когда она есть, в таком случае мы знаем и ip, и порт, а следовательно можем сразу тыкаться туда, когда запустим это дело, и понимать, живая ли система.
В случае же, когда dhcp отдаёт динамический адрес, сначала нужно будет искать новую аренду в роутере, что немного усложнит задачу.

Для начала качаем релиз убунты, я тестил 20, 22 и 24, с 18 в теории должно сработать, но мне за эти гайды никто не платит, и вообще у неё основная поддержка закончилась, поэтому нафиг надо.
Удобно можно скачать с releases.ubuntu.com, там нужно выбрать релиз, а затем лайв-сервер, например ubuntu-24.04.2-live-server-amd64.iso.
Файл раскатываем на флешку, после чего нужно добавить конфиг.

В корне флешки создайте директорию nocloud.
В директории nocloud создайте пустой файл meta-data
Рядом с ним ещё один файл: user-data, в него нужно прописать конфиг:

#cloud-config
password: rkbfc3465
ssh_pwauth: true
chpasswd:
expire: False


Не удаляйте комментарий #cloud-config! Без него не взлетит!
Уже не вспомню, почему именно такой набор параметров, ибо вопросом этим задавался ещё пару лет назад, читал много разных статей на разных ресурсах, но будто бы с таким конфигом всё работает.
Общий смысл такой, этим конфигом включается ssh и задаётся пароль от него.

Конфиг положили, теперь нужно отредактировать файл boot/grub/grub.cfg
В нём нужно найти строчку с ядром и его параметрами, она задаётся командой linux.
Выглядит примерно так: linux /casper/vmlinuz ---
Для того, чтобы nocloud понял, откуда ему читать конфиг, нужно указать его параметром ядра.
Есть и другие способы, но этот для нашей задачи самый простой.
Параметр такой: ds=nocloud\;s=/cdrom/nocloud/
Бэкслэш перед точкой с запятой нужен для её экранирования, т.к. grub воспринимает её по-своему.
Таким образом строка принимает вид: linux /casper/vmlinuz ds=nocloud\;s=/cdrom/nocloud/ ---
Почему там иногда 2 пробела, и зачем 3 дефиса в конце я фиг его знает, но на всякий случай ничего не трогал.

В файле grub.cfg от 20 ubuntu есть параметр quite, и почему-то, когда он есть, cloudinit некорректно инициализируется (ssh поднимается, но пароль не подходит), если будете ставить и столкнётесь с этим, просто удалите quite из cmdline.
А также я отчётливо помню, что пару лет назад система не ставилась, ругаясь на несовпадение контрольных сумм.
Воспроизвести мне это не удалось, но если у вас возникнет такая ошибка, то пересчитайте md5 для grub.cfg, и обновите её в файле md5sum.txt.

А на этом неожиданно всё, можно сохранять файл, загружать машину с флешки (у вас должен быть какой-то способ это сделать), и запускать систему.
После запуска в течение нескольких минут должен подняться ssh сервер, зайдя на который под юзером installer можно будет выполнить установку в псевдографическом интерфейсе subiquity.
Пример: ssh installer@192.168.0.123
Про работу в этом интерфейсе со скринридером я расскажу в конце поста, но заранее предупреждаю, что он достаточно блевотный, и по-хорошему по нему надо аудиогайд писать.
Кодерская мастерская
Часть первая: самый простой и тривиальный кейс установки. Имеется некая headless машина, на которую нужно установить серверную убунту, машина подключена к маршрутизатору патчкордом, ей выдаётся статический адрес. Статика не обязательна, но лучше, когда она…
Часть вторая: установка на сервер.
Бывают редкие ситуации, когда нет доступа к серверной панели, или после переустановки пароль хостер высылает на почту, к которой нет доступа.
Также сервер может быть не арендованным, а стоять в каком-то офисе, физический доступ к нему в моменте может отсутствовать, а систему нужно переставить вот прям уже вчера.
В таком случае можно переустановить систему в обход панели управления, пользуясь тем, что установлено на борту сейчас.
Конечно если система уже мёртвая, сделать с этим ничего не получится, но если сервер функционирует, провернуть нижеописанное вполне возможно.

Чтобы загрузиться в установщик нужно, чтобы у вашей системы было собственное ядро, т.е. OpenVz пролетает.
Запустить установку на сервере в чём-то даже проще, чем на собственной headless машине, ибо сеть там уже настроена, и скорее всего заработает из коробки.
Сложность только в том, что флешку в сервер не воткнуть, и нужно как-то модифицировать iso-файл.

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

И так пересобирать iso не очень хочется, но когда он станет загружаться, по-любому в какой-то момент будет загружено ядро, и в него совершенно точно можно передать какие-то параметры.
Cloudinit умеет считывать конфигурацию из параметров ядра, но будто бы это не относится к user-data.
Всё, что удалось найти в документации: "On the kernel command line, anything found between cc: and end_cc will be interpreted as cloud-config user-data."
В каком формате должна быть user-data, какие ограничения или особенности абсолютно непонятно, и нет ни единого примера.
Но в процессе гугления я нашёл исходник cloudinit парсера командной строки ядра, и в нём как раз разбирается конфиг между cc и end_cc.
Оказалось, что содержимое user-data нужно закодировать в percent-encoding, и поместить между токенами cc и end_cc.

Окей, мы можем передать user-data с настройками ssh, но как же это сделать?
Для загрузки iso-образа можно воспользоваться grub, в котором нужно создать новую menu entry.
И не забывайте о том, что вы ставитесь не с флешки, то есть образ нужно положить на тот раздел, который не будет затронут в процессе установки.
Если в сервере один диск, и он полностью отдан под систему, можно уменьшить файловую систему и под iso-файл сделать маленький раздел, после переустановки его можно будет удалить, и расширить системный раздел обратно.

Допустим вы скачали iso-файл установщика ubuntu и положили его на отдельный раздел, теперь нужно создать menuentry.
Для этого существует файл /etc/grub.d/40_custom, в который нужно добавить примерно следующее:

menuentry 'ubuntuInstaller' {
insmod part_gpt
search --no-floppy --fs-uuid --set=root abc123
set isofile="/root/ubuntu-24.04.2-live-server-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz iso-scan/filename=${isofile} ds=nocloud cc: %23cloud-config%0Apassword%3A%20rkbfc3465%0Assh_pwauth%3A%20true%0Achpasswd%3A%0A%20%20expire%3A%20False%0A end_cc ---
initrd (loop)/casper/initrd
}


Вместо abc123 вам нужно задать идентификатор файловой системы в которой лежит iso, его можно получить с помощью dumpe2fs или blkid.
grub сам найдёт раздел, в котором лежит fs, и будет использовать её как root.
Также нужно поменять путь до iso-файла, затем сохранить файл и выполнить update-grub.
Кодерская мастерская
Часть вторая: установка на сервер. Бывают редкие ситуации, когда нет доступа к серверной панели, или после переустановки пароль хостер высылает на почту, к которой нет доступа. Также сервер может быть не арендованным, а стоять в каком-то офисе, физический…
Теперь нужно перезагрузить сервер в установщик, и если там вдруг не UEFI, вероятно ничего не получится, и потребуется физический доступ.
Однако 2025 год на дворе, и UEFI достаточно давно и достаточно много где, как минимум на арендуемых серваках.
Поэтому выполняем grub-reboot ubuntuInstaller, и надеемся, что всё будет ок.
Команда произведёт некие магические модификации в UEFI env vars, но перезагрузку сама не выполнит, поэтому нужно ручками сделать reboot.
В мануале написано, что grub-reboot загружается в заданную entry только один раз, и при следующей загрузке снова загрузится дефолт, но в некоторых случаях выбранная entry может застрять, учитывайте это.

После ребута периодически тыкаемся ssh в 22 порт (он кстати должен быть открыть в фаерволе хостера), в какой-то момент должен подняться subiquity.


Часть третья: телефон как модем.
Допустим у вас есть телефон на android и headless машинка, к которой не подключено ничего кроме питания, и вы очень сильно хотите поставить на неё ubuntu.
Сделать нужно следующее:
1. Подготовить флешку по первой части.
2. Подключить телефон к машине usb-кабелем.
3. Начать загрузку с флешки, сразу же начать раздачу интернета с телефона.
4. Включить точку доступа на телефоне.
5. Подключиться к точке доступа телефона, через неё пролезть в ssh-сервер subiquity.

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

А расклад достаточно неприятный, при раздаче по проводу, я попадаю в подсеть 192.168.198.0/24, а при раздаче по Wi-Fi - 192.168.173.0/24.
Подсети меняются со временем, но суть в том, что они разные, и из одной в другую пролезть извне не получится.
Извне нельзя, но если в сам телефон залезть, то у нас будет доступ к обоим подсетям.

Включаем adb, переводим в tcp mode.
При подключении к телефону через его hotspot можно подключиться по adb сходив на шлюз и порт 5555, кстати шлюзом легко может быть адрес по типу 192.168.173.151, т.е. не ожидайте, что последним октетом будет единичка.

И так мы раздали Wi-Fi с телефона, подключились к нему и попали в shell телефона.
Теперь можно подключать телефон проводом, и у нас даже будет доступ в подсеть для usb-раздачи, но есть ещё один нюанс.
Я так и не нашёл свежесобранного ssh-клиента под android, а также я не уверен, что весь псевдографический мусор будет корректно передан через adb.
Поэтому проще пробросить порты на нашу машину, и работать полноценным клиентом через полноценный shell.

О пробросе портов через adb я вспомнил слишком поздно, сейчас уже нет возможности проверить, поэтому опишу способ без adb forward, а в будущем обновлю пост.

UPD из 2025-10-31, adb не умеет пробрасывать на произвольные адреса, так что оставляю всё как есть.

Единственный софт, который сработал - это тяжёленькая приложуха на go, весит около 20 мегабайт, умеет следующее:
Сейчас вам возможно покажется, что вы попали на aliexpress: The GoProxy is a high-performance http proxy, https proxy, socks5 proxy, ss proxy, websocket proxies, tcp proxies, udp proxies, game shield, game proxies. Support forward proxies, reverse proxy, transparent proxy, internet nat proxies, https proxy load balancing, http proxy load balancing , socks5 proxies load balancing, socket proxy load balancing, ss proxy load balancing, TCP / UDP port mapping, SSH transit, TLS encrypted transmission, protocol conversion, anti-pollution DNS proxy, API authentication, speed limit, limit connection.
Ну как, захотелось купить? Штука и правда имеет коммерческую версию, но нам она не понадобится.

Качаем билд под вашу архитектуру android со страницы релизов: https://github.com/snail007/goproxy/releases
Далее закидываем на телефон, причём просто на карточку класть смысла нет, оттуда запустить не получится.
Без рута доступна директория /data/local/tmp, в ней флаг executable не запрещён.
Поэтому пушим бинарник в /data/local/tmp, chmod +x, и готовимся к установке.
Кодерская мастерская
Теперь нужно перезагрузить сервер в установщик, и если там вдруг не UEFI, вероятно ничего не получится, и потребуется физический доступ. Однако 2025 год на дворе, и UEFI достаточно давно и достаточно много где, как минимум на арендуемых серваках. Поэтому выполняем…
Если планируете ставить ubuntu ниже 24, или просто для перестраховки, можно добавить network-config для usb-устройства, иначе cloudinit проигнорирует сетевой интерфейс.
Почему-то из файла он загружать его не захотел, но загрузил из параметра ядра, выглядит это так:

ds=nocloud\;s=/cdrom/nocloud/ network-config=H4sIAIxzLGgC/5XLOwqAMBAE0F7IHaYOpBGr3CbGgRV0lWS18PSKWthazuftLHVcNKJ1DU1YlFaja4DjCGmaAvVOwCB57SKsbHyKOVmWdwQ0zYyg+q81+YVNvnqr/R993f0JKz7GMs4AAAA=


network-config в данном случае - это конфиг в yaml формате, пожатый с помощью gzip и закодированный в base64, исходный конфиг такой:

version: 2
ethernets:
zz-all-en:
dhcp4: true
match:
name: en*
zz-all-eth:
dhcp4: true
match:
name: eth*
zz-all-usb:
dhcp4: true
match:
name: usb*


Нейминг странный, конфиг расширял на основе примера из доки, не знаю, для чего добавлять zz в начало, будто бы имя секции может быть любым.
С таким конфигом раздача завелась на 20 и 22 ubuntu, другие не пробовал.

Подключаем телефон проводом к компьютеру, на котором будем ставить систему, загружаемся с флешки, сразу включаем раздачу по usb.
В процессе загрузки телефон может периодически решать, что устройство отключилось, и раздача может прекратиться, поэтому первые секунд 20 следите за ней, и включайте заново.
Если включить её потом, cloudinit может проигнорировать новый интерфейс, поэтому лучше включать как можно раньше.
Также подключаемся к hotspot-у телефона, заходим в shell через adb.
Теперь мониторим файл /proc/net/arp
Содержимое достаточно читаемое, представляет собой arp таблицу, в ней вы в какой-то момент должны увидеть новое устройство в подсети usb-tethering-а, это и есть наша ubuntu.

Далее запускаем proxy:
/data/local/tmp/proxy tcp -p ":1234" -T tcp -P "192.168.191.188:22"


Подставьте в качестве целевого ip адрес вашей машины.
Прога поднимется, должны побежать логи.
Открываем второй терминал, в нём подключаемся по ssh, используя адрес вашего телефона и порт 1234, и да здравствует subiquity!
Теперь, главное, чтобы этот шайтан-мост не развалился в середине установки, и удачи, если решитесь повторить.

Немного о subiquity:
Буду краток, это достаточно мутная псевдографическая срань, в любой непонятной ситуации используйте горячку для просмотра текущей строки, в nvda это nvda+up, а также имейте в виду, что некоторые подменю разварачиваются как бы справа от главного меню, что добавляет немного веселья и безумия в скучный и унылый процесс установки.
Как подменю, например, открывается конфигурация разделов в конфигураторе дисков, и nvda одновременно видит куски из обоих интерфейсов, очень удобненько, всем рекомендую.
Правый и левый каналы поменялись местами в моих беспроводных наушниках.
Я не менял никаких настроек в винде, просто в какой-то момент заметил, что они поменялись, ещё 3 часа назад всё было нормально, а 5 минут назад - уже нет.
Как же я это исправил?
Выключил и включил наушники, т.е. проблема случилась где-то между usb-свистком и самими наушниками, а винда тут, скорее всего, не виновата.

#ОноСломалось
После обновления до 24h2 раз в несколько дней от проводника приходит следующее уведомление:
"При получении трассировки произошла ошибка."
Никаких проблем будто бы больше нет, но вот сегодня я решил от нефиг делать запустить стандартный механизм проверки и восстановления целостности системных файлов, он сказал, что чего-то там восстановил, и теперь у меня пропал поиск в меню пуск, а перезагружаться лень.

#ОноСломалось
👍1
Кодерская мастерская
После обновления до 24h2 раз в несколько дней от проводника приходит следующее уведомление: "При получении трассировки произошла ошибка." Никаких проблем будто бы больше нет, но вот сегодня я решил от нефиг делать запустить стандартный механизм проверки и…
Я починил пуск, было достаточно перезапустить проводник!
А потом ещё раз перезапустить.
И ещё раз.
И после трёх перезапусков проводника поиск в пуске появился.
Точно цитату не помню, но смысл примерно такой: "Безумие - это многократное повторение одного и того же действия с одним и тем же результатом, в надежде получить что-то новое".
Но в случае с виндой выходит, что клин клином вышибать приходится.
👍1
Каждый раз, когда я ставлю незнакомый софт, я на сто раз проверяю, точно ли я устанавливаю не поддельную версию. Если это приложение в google play, смотрю на кол-во оценок и скачиваний (у фейка не будет высокого рейтинга и миллионов загрузок), если ставлю пакет из пакетного менеджера, несколько раз перепроверю написание, если ставлю что-то малоизвестное, до последнего буду пытаться найти официальный сайт продукта и т.п.
Например однажды минуты на 3 залип при установке яндекс музыки, когда увидел, что её выложил не яндекс, а какой-то Direct Cursus Computer Systems Trading LLC.

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

Более мне добавить нечего, рекомендую и вам следить за тем, что и откуда вы ставите.

Видос на англ:
https://www.youtube.com/watch?v=rUzzBY-P3HE
👍21
Юристы имеются среди подписчиков?
Заказал товар в dns с предоплатой, постомат сломался, сотрудник вскрыл ячейку вручную и выдал коробку, в системе заказ продолжает отображаться как ожидающий получения.
Если отменить, фокус сработает и деньги вернуться, то нарушу ли я закон таким образом?
Вопрос гипотетический, ибо цена эксперимента - косарь рублей, но интересно всё же.
Зашёл на gitverse, и вижу в шапке следующее:
"В 22:00 МСК будет объявлен перерыв - 15 минут. Вы отдыхаете - мы обновляем!"

И вот с одной стороны о какой конкуренции можно говорить, если у них бывают даунтаймы в принципе, а с другой стороны - github, перед тем как прилечь на часок, когда вас предупреждал об этом, а?..
👍1
Как открыть чат в последней версии telegram для Android

Если
вам сильно надо открыть чат с человеком в тг, и чата у вас с ним нет, для этого ранее использовалась кнопка в профиле.
В последней версии телеграмма доступность поломали, и кнопку скринридеры не видят.
Обходное решение следующее: в профиле открыть дополнительные действия (3 точки), там добавить ярлык чата на главный экран, выйти на главный экран и открыть чат пользуясь созданным ярлыком.
Когда что-то напишете, чат, как обычно, окажется в списке чатов, и ярлык можно будет удалить.

#A11yTricks
👍1
Forwarded from Gozaltech blog (Beqa Gozalishvili)
What's new?
Close
5.69.1
September 31, 2025
We’ve launched a new Сoncerts section. Here you’ll find live shows' announcements from artists you might like. Dates, venues, and tickets — all in one place. Come in and choose where to go next

Closer to the stage,
Yandex Music team

Это я получил в качестве changelog-а после обновления Яndex музыки.
Youtube-канал Сергея Немчинского переходит исключительно на Украинский язык.
И с одной стороны, учитывая количество поступающего в мозг контента, плюс минус одна подписка ничего не решает, но с другой стороны, когда смотришь блогера долгие годы, и когда просмотр видосиков конкретного человека или команды продолжает быть интересным всё это время, обычные видосики становятся чем-то слегка большим, чем-то родным, привычным.
Конечно печально наблюдать как человек, с вроде бы похожим складом ума, вдруг решает прекратить использовать инструмент, просто потому, что его родина - родина неприятеля.
Можно конечно начать раскрывать тему и сказать, что язык нельзя сравнивать с молотком или автоматом, что язык - это культура, обычаи, образ мышления и тому подобные вещи. Но по сути своей, на околотехническом канале русский язык выполнял роль, в первую очередь, инструмента для коммуникации блогера с аудиторией, однако мнение автора, к сожалению, оказалось иным.
Учить целый язык из-за единственного блогера - точно не то, чем мне хочется заниматься в ближайшее время, а потому минус одна подписка, ни больше, ни меньше.

PS
В целом ситуация неоднозначная, мне лично кажется, что он сам может и не против, но кто-то сильно попросил, ибо человек не полностью самостоятельно блогерством занимается.
Отключение нового repl в python 3.13

Спустя пару месяцев страданий я совершенно неожиданно для себя нашёл решение за 30 секунд.
Обновившись до питона 3.13, я столкнулся с тем, что они переделали интерактивный режим.
Во-первых он теперь заставляет windows terminal на каждую введённую буковку выплёвывать весь промпт, таким образом при написании каждого символа кода в nvda попадает всё ранее написанное.
С этим я как-то вроде даже смирился, но потом оказалось, что ввод многострочного кода стал... странным. Хз даже как описать, если кратко, то за пару минут я с ним не разобрался и забил.
Пока я просто пишу код всё идёт хорошо, но как только хочу повторить ранее введённые строки, начинается какая-то дичь (они будто не вводятся и не исполняются, а если даже и вводятся, то интерпретатор застревает в каком-то странном режиме, из которого фиг пойми как выйти, кроме как по ctrl+c).
Наконец я решил попробовать загуглить, что же это такое они сделали и как теперь с этим жить, а оказалось, что можно сетнуть переменную PYTHON_BASIC_REPL, и новое поведение отключится.

#A11yTricks
Приколы доступности от сбера

Открыл гигачат, и вижу такое поле:
"clickable Опишите вашу edit multi line"
Т.е. это текстовое поле с меткой "Опишите вашу", а дальше, видимо, уже от фантазии пользователя зависит.
В процессе тыканья я выяснил, что в placeholder поля динамически дописываются слова, видимо побуквенно, процесс этот можно наблюдать открыв dev tools.
Однако nvda захватывает то, что там было при разворачивании вкладки, и таким образом, пока я это выяснял, мне попалось: "Опишите вашу зад".
По-моему с таким предложением они переплюнули даже Грока от Илона Маска.
😁31
Сколько должно быть опыта в программировании, чтобы перестать допускать такие ошибки?
        if self.timer.enabled:
self.enable_item = self._add_menu_item(_("Enable"), self.on_enable)
else:
self.disable_item = self._add_menu_item(_("Disable"), self.on_disable)

Кстати скоро выпущу переработанный и переделанный с нуля аддон audioTimer, можно добавлять несколько таймеров, настраивать кастомные звуки срабатывания, задавать количество повторений таймера, повторяющиеся уведомления после истечения таймера...
Начал использовать ИИ для программирования, и вдруг меня посетила глубокая мысль.
Сначала человечество придумало динамически типизированный язык, чтобы упростить себе жизнь.
Потом человечество придумало type hints для динамически типизированного языка, чтобы упростить себе жизнь.
А потом человечество придумало ии пишущего тайпхинты, чтобы упростить себе жизнь.
В какой же момент мы свернули не туда?..
Читая логи nvda, порой можно найти интересные вещи, однажды я писал про "Разрушительный сбой", а сегодня делюсь вот таким:

FileNotFoundError: [WinError 18] Больше файлов не осталось.

Остаётся только догадываться, куда же все они делись...