Кодерская мастерская
137 subscribers
1 photo
14 files
39 links
Блог Данила Пылаева
Download Telegram
Начал использовать ИИ для программирования, и вдруг меня посетила глубокая мысль.
Сначала человечество придумало динамически типизированный язык, чтобы упростить себе жизнь.
Потом человечество придумало type hints для динамически типизированного языка, чтобы упростить себе жизнь.
А потом человечество придумало ии пишущего тайпхинты, чтобы упростить себе жизнь.
В какой же момент мы свернули не туда?..
Читая логи nvda, порой можно найти интересные вещи, однажды я писал про "Разрушительный сбой", а сегодня делюсь вот таким:

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

Остаётся только догадываться, куда же все они делись...
Исправляем pager в git

Вводные данные: вы используете windows terminal, git, и в качестве пейджера используется less.
Pager - это такая штука, через которую git, или любая другая программа выводит данные постранично.
Это всё хорошо и классно работает, Но проблема следующая, когда, допустим, просматриваем log, less вроде открывается, но для nvda по прежнему доступен весь буфер, и найти первую строку выведенной страницы достаточно сложно.
Раньше я думал, что это особенность nvda и/или less, но в какой-то момент заметил, что less, открытый вручную, ведёт себя как раз так, как нужно, он перекрывает старый буфер, и shift+numpad7 приводит курсор к первой строке на странице.
В результате гугления я выяснил, что git, по дефолту, запускает less с переменной окружения LESS, через которую передаёт в него параметры FRX.
И F, например, достаточно полезен, он заставляет less не входить в интерактивный режим, если выхлоп помещается на один экран, однако X, как оказалось, ломает нужное нам поведение, и из-за него во-первых nvda может убегать за границы страницы, а во-вторых после закрытия пейджера на экране остаётся огрызок текста.
Решения у проблемы два. Задать переменную LESS самостоятельно, или переопределить поведение less, заставив его выключить то, что было включено через environment.
Второе решение кажется мне наиболее удобным и правильным, т.к. мы точечно лечим исходную проблему less + git, не затрагивая другой софт, который тоже может выводить что-нибудь через less.
А сделать это можно одной простой командой:
git config --global core.pager "less -+X"

Теперь логи, дифы и иные полезности будут выводиться без побочных эффектов, и с ними можно будет удобно взаимодействовать в windows terminal.
Кстати для удобного чтения дифов в терминале рекомендую дополнение dev box, ибо продуктивность, по крайней мере в моём случае, заметно выросла, и будто бы это гораздо удобнее, чем решение, предлагаемое в vscode, в прочем, это уже совсем другая история.
Однажды проходил курсы на яндекс практикуме, с тех пор на github остались учебные репы.
И уже несколько лет, каждую неделю мне github присылает письма с уведомлениями о том, что то в одной, то в другой репе они автоматически нашли уязвимость.
А сегодня настал тот день, когда мне надоели эти письма, и я решил их выключить, ибо конкретно в этих репозиториях я ничего менять не планирую, и просто храню их для истории.
Так вот за все эти годы в одном из репозиториев, гитхаб нашёл, внимание... 135 уязвимостей!
Остаётся только надеяться, что ни один из десятков сервисов, которым мы ежедневно доверяем свои данные, не имеет такой выдающийся метрики.
🔥1😢1
Вхожу в сервис альфа-страхование через госуслуги, выдал все разрешения, жду редиректа.
Доолго жду, секунд 20.
И дождался:
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 41959424 bytes) in /var/www/alfastrah/htdocs/public/bitrix/modules/main/classes/mysql/database_mysqli.php on line 54
[ErrorException] E_ERROR
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 41959424 bytes) (0)
/var/www/alfastrah/htdocs/public/bitrix/modules/main/classes/mysql/database_mysqli.php:54
----------


#ОноСломалось
Автоматизация публикации аддонов в NVDA addon store

Для понимания и использования описанного ниже, вы должны быть знакомы с проектом addonTemplate, а также в общих чертах разбираться в github actions.

Совместно с Бекой (AKA gozaltech) мы разработали относительно простой набор скриптов, автоматизирующий публикацию дополнений nvda в официальный магазин дополнений.
Я уже сделал с их помощью около десятка публикаций, и, по вашим просьбам, опишу ниже, как это работает.

Суть публикации состоит в том, что вы должны создать issue в github-репозитории для приёма дополнений.
В issue нужно указать всю необходимую информацию об аддоне (название, версию, прямую ссылку на nvda-addon файл и т.п.).
Далее аддон проходит полуавтоматическую проверку, и если у ребят из nvaccess, занимающихся приёмкой, не возникает вопросов, от вас не требуется никаких действий, и аддон попадает в магазин.
То есть в большинстве случаев единственное действие для публикации аддона - это создание issue, далее всё происходит без вмешательств.

Как работают скрипты:
1. Вы подготавливаете исходный код аддона на основе addon template.
2. Пишете команду: scons release version=0.1.0 channel=dev.
3. scons модифицирует build vars, создаёт тег релиза и выполняет push.
4. На тег релиза тригерится github actions workflow, который собирает nvda-addon файл и создаёт issue в репозитории addon store от вашего имени.

Дальнейшую коммуникацию с nvaccess, при необходимости, вы ведёте в issue самостоятельно.

Как настроить:
Для начала нужно выпустить personal access token для вашего github аккаунта, не буду описывать, как именно это сделать, процедура достаточно тривиальная, в доке гитхаба разобрана по шагам.
Я рекомендую выпускать полноценный, а не fine-grained токен, так как fine-grained нельзя сделать бессрочным, и его придётся периодически перевыпускать.
При создании токена можно дать доступ только на создание issues, это конечно позволит потенциальному злоумышленнику, похитившему токен, создать issue в любой репе от вашего имени, но не позволит произвести иные деструктивные действия.
При этом токен будет вечным, и его можно будет использовать годами.
После выпуска токена его нужно добавить в секреты репозитория вашего аддона, с именем USER_TOKEN.
Затем нужно добавить в репозиторий workflow файл и обновить sconstruct.
К сожалению ни мои, ни Бекины руки не дошли до того, чтобы законтрибьютить это в репозиторий addon template, но файлы можно взять из репозитория существующего аддона.
Я рекомендую https://github.com/addonWorkshop/speechFilter
Так как там есть кое-какие полезные правки.

Вам нужно забрать директорию .github, а также файл sconstruct, и положить в свой репозиторий.
Затем достаточно выполнить `scons release channel=<channel> version=<version>, и если всё получилось, то через какое-то время в nvaccess/addon-datastore будет создана issue.
Для отправки issue используется action https://github.com/beqabeqa473/submitNVDAAddon
Вы можете ознакомиться с его readme, чтобы узнать о возможных входных и выходных параметрах.
Ну и в целом стоит прочитать инструкцию перед использованием, не правда ли?..

UPD

Пожалуй стоит упомянуть мой вариант настройки, в котором я использую отдельную организацию на github.
Сделал я её по одной простой причине, у github есть возможность создавать organizational secrets, и именно для этого организация и нужна.
Таким образом, мне достаточно просто создать репозиторий в организации, и ему сразу доступна переменная USER_TOKEN, что довольно удобно.
codeHelper-0.2.0.nvda-addon
2.9 KB
Озвучивание текущей строки в vscode

Многие привыкли нажимать ctrl+g в vscode, чтобы быстро узнать номер текущей строки, однако пару версий назад разработчики запороли доступность этого диалога, и номер строки перестал озвучиваться.
А в предпоследней версии починили.
А в последней версии опять запороли.
Поэтому вот простенький аддон, который позволяет узнать номер строки по нажатию nvda+g.
И хоть буквально в предыдущем посте есть инструкция по автоматизации публикации в addon store, даже при её наличии мне выкладывать аддон лень, так что по старинке.
👍2
Сегодня Кемеровчанам мчс разослал смски, в которых предупредил о похолодании до -350 по цельсию.
И что обидно, бате пришло, брату пришло, а мне пришло, но там -35 написано, не знаю как так, возможно есть некая очередь рассылки, и тот, кто был в ней раньше, получил -350, а потом кто надо увидел ошибку, внёс правку, и до меня уже докатилось исправленное сообщение.
👏1
Тестирую одну штуку в github actions, около получаса ран висит в состоянии queued (то есть в очереди).
На githubstatus.com гордо красуется надпись "All Systems Operational", и вот вопрос: как я могу быть уверен в стабильности инфраструктуры? Если своими глазами вижу проблему, а, как говорится, на бумаге всё впорядке.
И либо реально проблема ооочень специфична, и затронула очень малый процент репозиториев, либо информация об инциденте появится через пару часов, когда она нафиг уже будет не нужна.
Маленький секрет о формате yaml

yaml формат имеет огромное множество нюансов, позволяет делать кучу трюков с помощью различных синтаксических фишек, и часто наличие таких возможностей приводит к неожиданному поведению при парсинге.
Например значение no, не обёрнутое в кавычки, превращается в false.
Или многострочный литерал может схлопнуться в однострочный, когда вы этого не хотите, или наоборот.
Или можно ошибиться с отступом, и хорошо ещё, если оно не спарсится, а ведь может спарситься неправильно...
В общем я это всё к тому, что при работе с yaml у многих частенько подгорает, и на случай, когда подгорает очень сильно, есть одно интересное решение.
yaml представляет собой надмножество json, то есть в нём можно делать json вставки, например так:
- action: media_player.play_media
target: {"entity_id": "media_player.yandex_station1"}

Таким образом можно делать конфиги компактнее, но можно пойти немного дальше.
Вдумайтесь, yaml, это, надмножество, json.
Что это значит?
Это значит, что любой полноценный yaml-парсер понимает json, и спецификацией никак не ограничивается тот момент, с которого можно начинать использовать его.
В том числе никто не запрещает сделать json-объектом... весь документ.
Вы можете взять весь ваш огромный конфиг, от которого у вас пылает жопа, перегнать его в json, положить на место исходного yaml, и с точки зрения парсера ничего ненормального не случилось, это по прежнему валидный yaml, ведь, как вы помните, yaml - это надмножество json!
История одного вайбкода

CTO подключил к рабочему чату агента на базе OpenClaw, и выдал ему кучу доступов.
OpenClaw - это платформа, на которой можно собирать ии-агентов на любой вкус и цвет, можно дать ему доступ к телеграму, к гитхабу, можно дать ему соцсете и т.п.
В нашем случае у него есть доступ к трекеру задач, которыми можно управлять прямо из тг (менять статусы, создавать, назначать исполнителей).
А также у него есть доступ к к приватным репозиториям на gh, и даже к почте кажется есть доступ.
Невероятно безопасненько (нет), но во-первых это всё добро не под моей ответственностью, а во-вторых пост немного о другом.
К этому агенту подключен и клод-код, которого он запускает где-то там в контейнере, и мне показалось интересной идеей завайбкодить довольно крупную фичу.
Как и полагается вайбкодеру, я прямо в тг-чат скинул задачу, описал более-менее подробно требования и ушёл пить чай.
Сделать нужно было регистрацию через платёж, т.е. юзер приходит в сервис, первым делом оплачивает, при оплате вводит email, по факту успешного платежа мы создаём юзеру аккаунт и добавляем преобретённый цифровой продукт.
Когда юзер возвращается из платёжной системы, мы сразу его авторизовываем, и показываем информацию о купленной услуге. Всё бесшовно, быстро, красиво и приятно.
У такого подхода есть пара узких мест, но маркетологам виднее, сказали, что надо, значит надо.
В общем пока я отдыхал, шайтан-машина минут за 20 накидала функционал, и я полез ревьюить.
Довольно быстро обнаружился маленький нюанс, который мог обернуться большими неприятностями для компании.
Гостевая оплата работает через лендинг, т.е. юзер переходит по особой ссылке с лендинга, попадает в основной продукт, и оттуда сразу в платёжную систему.
Звучит просто, но есть один интересный инвариант: что если пользователь ранее уже бывал в продукте?
В таком случае мы просто добавим ему в аккаунт ещё одну услугу, бизнес-правила это позволяют, но нужно кое-что учесть.
Допустим проектом воспользовался юзер Вася, а у Васи есть друг Петя, которому очень хочется попасть в аккаунт Васи.
Петя заходит на лендинг и переходит в продукт, ему известна Васина почта, он вводит её, оплачивает услугу, и о ужас, попадает в аккаунт Васи!
Происходит это потому, что великолепный клодкод на бэкенде не учёл этот инвариант, и выдаёт токен как новым, так и уже существовавшим пользователям.
Причём код, который учитывает, что юзер мог существовать есть, и фикс встраивается туда парой строчек, но этих самых важных строчек как раз и не хватило.
Тривиальная это уязвимость? Нет. Легко её заметить? Думаю не очень легко, но и не сложно. Вся разница только в том, что программист с несколькими годами опыта заметил, а машина - нет.

Вайбкодьте с осторожностью.
👍2
Сегодня мне приснилось, что все люди — это продукт мышления искусственного интеллекта, который пытается понять, как он был создан, и прокручивает всевозможные сценарии со всеми деталями, ну а человечество, стало быть, живёт в таком сценарии.
👍1
Сломался docker desktop, чинил-чинил, вроде починил, зашёл в трей чтобы найти его иконку, попал на иконку конфиденциальности, и в этот момент меня отвлекли, отошёл буквально секунд на 40, фокус в это время стоял на всё той же иконке, (там было написано про teamtalk), и что же я вдруг услышал?
"Конфиденциальность Кем используется местонахождение:
Windows Web Experience Pack: Widgets provide local weather, news, and more"
То есть висело там уведомление про использование микрофона программой teamtalk, окей, тут вопросов нет, и вдруг на доли секунды появляется какая-то там погода, которой разрешений я не давал никогда.
Причём исчезло очень быстро, если туда не смотреть, никогда не заметишь.
В последней версии дополнения Weather_Plus был обнаружен троян.

По крайней мере версия 10.7 содержит вредоносный код, почитать подробнее можно тут: https://github.com/nvaccess/addon-datastore/issues/9360

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

Что касается именно трояна: Weather_Plus, зачем-то, использует для проигрывания звуков библиотеку bass, хотя проиграть wav можно и средствами nvda, и именно в bass был найден вредонос.
В nvaccess почему-то уверены, что вирус в аддон попал случайно, вот только есть 1 нюанс.
Компания Un4seen, которая разрабатывает bass, подписывает dll-файлы, подпись эту можно легко увидеть и убедиться, что файл легитимный.
Как можно догадаться, bass.dll из wp не подписан, но не подписан он не только в версии 10.7, но и в версии 9.5, которая завалялась у меня на компе.
А ещё я на nvda.ru нашёл версию 6.2 (круто, что они хранят старые версии), и разумеется там bass тоже не оригинальный.
То есть разработчик, преднамеренно или нет, использовал палёный непонятно откуда добытый bass, и было ли в тех версиях второе дно, большой вопрос.
Ну и напоследок: если кому-то показалось, что я чрезмерно субъективен, вот вам строчка из кодовой базы данного поделия, можете сделать вывод сами:
n, n, n, zipCodesList, define_dic, details_dic, defaultZipCode, n, modifiedList, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n = _mainSettingsDialog.GetValue()
👍1
Как-то писал о том, что меня преследуют приколы и баги, связанные со временем, вот ещё один.
import asyncio
import time
async def main():
start_time = time.time()
await asyncio.sleep(10)
print(round(time.time()-start_time, 3))
if __name__ == '__main__':
asyncio.run(main())

Запускаю внутри wsl, и выводится 8.195, иногда чуть больше 10, как положено, а иногда 8 с хвостом.
И пока даже не могу нагуглить, что это вообще такое.
То есть я понимаю, что расходится monotonic с часами реального времени, но какого хрена?
Любители преодоления цифровой недоступности могут попробовать пройти данный увлекательный квест
https://xn--80aatrqejgjg.xn--p1ai/
апкшку не ставил, хз что там, но вряд ли что-то опасное, создано шутки ради всё же.
Подробная история в данных постах и комментах под ними
https://t.me/ntr1_0/2792
https://t.me/ntr1_0/2793
Forwarded from Gozaltech blog (Beqa Gozalishvili)
Всем привет

Много лет я использовал TortoiseGit как основной инструмент для просмотра логов и diff’ов в Git. Во многом это была просто привычка, от которой сложно отказаться.

Но со временем появилась одна проблема - TortoiseGit начал очень сильно тормозить проводник Windows. Открытие контекстного меню могло занимать по 5-10 секунд, и это продолжалось годами. Вчера мне окончательно надоело, и я решил написать собственное решение.

Так появился gittools - небольшой набор инструментов для быстрого и удобного взаимодействия с Git.

Что уже есть:

просмотр логов;
просмотр diff’ов;
список веток;
git-алиасы для быстрого вызова команд.

Команды:

pull-log
log
branches
install-alias
uninstall-alias

После установки алиасов можно использовать:

git pl
git lg
git br

Например:
git pl
сделает pull, а если всё прошло успешно - откроет окно со списком коммитов и изменённых файлов. Нажатие Enter по файлу открывает diff viewer.

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

Решение получилось довольно нишевым и в первую очередь делалось под мои собственные привычки и workflow. Но если оно окажется полезным кому-то ещё - буду только рад.

Пост пишу немного в спешке, так что сильно за ошибки не ругайте :)