Кодерская мастерская
137 subscribers
1 photo
14 files
39 links
Блог Данила Пылаева
Download Telegram
Проблема доверия языковым моделям (часть 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
Приветствую всех подписчиков!

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

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

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

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

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

Начну пожалуй с начала, а именно с краткого описания функции ANC active noise cancellation (активное шумоподавление).
Работает оно довольно просто и одновременно сложно.
Вот есть у нас некий звук, например звук работающего двигателя.
А что такое звук?
Звук - это самые обыкновенные механические колебания среды, например воздуха.
Т.е. двигатель во время работы как бы ударяет по воздуху своим корпусом и подвижными частями, создаёт области повышенного давления, которые волнами расходятся вокруг.
Потом они достигают наших ушей, где-то там внутри, кажется во внутреннем ухе, преобразуются в электрические импульсы, которые следуют прямиком в мозг, где он их расшифровывает и мы слышим звук работающего двигателя.
Но сейчас нам интересно то место, где звук только приходит в ухо, проще всего что-то сделать именно там.
Самая простая идея, это просто заткнуть уши, и в общем то для этого существуют беруши, но в какой-то момент человечество пошло дальше и придумало следующее.
Вот есть у нас микрофоны, динамики и относительно мощные микроконтроллеры, а что если мы будем снимать звук с микрофона, обсчитывать микроконтроллером волны, попавшие на микрофон, и потом мембраной динамика попробуем эти волны погасить?
Ну и самое главное, что если это всё запихнуть в обычные наушники?
А получится в таком случае как раз активное шумоподавление, о котором я и хочу высказаться.
То есть, проще говоря, наушники с активным шумоподавлением слушают окружающую среду, и воспроизводят такой звук, который складывается со звуком из окружающей среды, и практически полностью гасится, но также гасит внешний шум.

Ну а теперь я перехожу к собственному мнению:
Я пробовал шумоподавление на нескольких моделях разного бюджета, от трёх, до, вроде 12 или 13 тысяч рублей, и во всех, абсолютно во всех случаях мне не зашло.
Да, действительно они гасят шум, причём гасят очень даже неплохо, особенно круто шумоподавление справляется с постоянным фоновым шумом, например со звуком работающего двигателя, что наверняка удобно в дороге.
Но есть один огромнейший минус: стоит включить шумоподавление, как я начинаю ощущать практически болезненное давление на уши.
Это ощущение сравнимо с резким изменением давления, при котором жёстко закладывает уши, и при попытках сглатывания слюны становится как будто только хуже.
И я пробовал к этому привыкнуть, но к сожалению не выдержал больше двух минут, причём самый сильный эффект наблюдался именно на самых дорогих наушниках (это были полноразмерные сенхайзеры, модель уже точно не помню, но могу поискать, если кого-то заинтересует).
Так вот в итоге я задаю вопрос вам, моей аудитории, вас тут почти сто человек как-никак:
Если вы использовали наушники с активным шумоподавлением, не заметили ли вы чего-то подобного, и если заметили, то насколько комфортно было использовать их в таком режиме?
И снова шестёрочки

Где-то выше был пост про 9 шестёрок в Unix time, но там вроде бы всё было очевидно, понятно и просто, а вот сегодняшний случай заставил меня немного поломать голову.

Пишу я значит сервис, работающий с БД postgres, и нужно мне записать в столбец бинарные данные.
Сделал столбец, пытаюсь с помощью sqlalchemy (библиотеки для работы с бд) записать тестовую строку, забываю один из НЕ nullable столбцов.
И получаю от базы следующую ошибку
DETAIL:  Failing row contains (null, testing, \x666666, 3).

Это не вся ошибка, а самая интересная её часть, давайте разберём её.
В этой строчке база говорит, с какой именно записываемой строкой произошла ошибка, и выводит её.
Сначала null - это именно тот первый столбец, который не может принимать такое значение, из-за него эта ошибка и возникла.
Второе значение testing - это тестовое значение какого-то строкового столбца, четвёртое значение 3 - уникальный идентификатор.
А вот третье, которое типа бинарное: \x666666.
И вот я когда его увидел, наверное с минуту пытался понять, что происходит, откуда оно взялось? И в итоге выяснил следующее.
В качестве тестового значения я ввёл три буквы f.
У маленькой буквы f в таблице ascii десятичный номер 102, а шестнадцатиричный - 66.
И вот тут самое интересное: то ли база, то ли её драйвер, попытался вывести именно шестнадцатиричные номера символов последовательности, но почему-то поставил \x только в начале, после чего просто слепил все цифры в кучу.
Ну и, разумеется, из fff получилось 66 66 66, что и вывелось как 666666.
Возможно это даже не баг, а просто особенность бд, потому что в общем то восстановить из этого исходную последовательность очень даже возможно, но просто забавно, что я рандомно ткнув в клавиатуру неожиданно получил именно такой результат.
Подключаем семейную подписку яндекса через боль и страдания

На всякий случай уточняю: все цитаты сообщений интерфейса не дословные, а написаны по памяти.

Начну, как обычно, с предыстории.

Когда-то давно, ещё в 2015 году, я слушал музыку в vk, и мне было ок.

Потом, году наверное в 18, я познал могущество и величие алгоритмов spotify, и полностью перешёл туда.

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

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

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

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

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

"Ща только быстренько семейную группу создам" - думал я.

"А потом быстренько расшарю себе плюс" - тоже я так думал.

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

Получилось же всё слегка иначе.

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

Заходим в аккаунт, яндекс просит код из пуша, тоже в общем то ожидаемо.

Иду за мобилкой, скриплю дверью, бужу батю, уже неприятно, но всё ещё не критично.
И т.к. сон у него довольно крепкий, я подозреваю, что разбудил его как раз тот самый пуш, а я ему давно рекомендовал настроить беззвучный режим на ночное время, так что вообще он сам виноват 🙂, ведь это могло быть любое другое уведомление.
Ладно, подсмотрел код, авторизовался, и дальше по инструкции яндекса надо вроде как создать семейную группу.
Нарулил соответствующий раздел в профиле, скопировал приглашение, переключился на свой аккаунт и вступил в группу.
Плюс по дефолту не получил, окей, логично, его просто надо расшарить!
Переключился в папин аккаунт, перешёл в настройки семейной группы, нашёл там себя.

Нажимаю на "Поделиться преимуществами плюса" (или как-то так), попадаю на страничку с предложением подключить плюс.
Странная страничка, ведь плюс на этом аккаунте уже подключен, ну окей, давайте подключим подключенный плюс ещё раз. Нажимаю на кнопку "Подключить", и открывается страница подключенного плюса.
СТраница стандартная, на ней уже про семейную группу ничего нет, есть только возможность отправить приглашение, но мне это не надо, я ведь уже вступил в группу, мне просто надо расшарить плюс! Как это сделать?!
Ладно, может он уже подключился, перехожу в свой аккаунт, но там мне предлагают оформить подписку, т.е. нифига не сработало.
Пукан начинает разогреваться, окей, возвращаюсь на батин аккаунт, перехожу к плюсу, высылаю себе приглашение, переключаюсь на свой аккаунт, открываю почту.
Кодерская мастерская
Подключаем семейную подписку яндекса через боль и страдания На всякий случай уточняю: все цитаты сообщений интерфейса не дословные, а написаны по памяти. Начну, как обычно, с предыстории. Когда-то давно, ещё в 2015 году, я слушал музыку в vk, и мне было…
Перехожу по ссылке, и, и, иии "вы уже вступили в эту группу!"
Вот же падла, нарукожопили, ну наверное это просто в интерфейсе тупняк случился, и мне выдалось право использовать плюс, правда ведь?
Открываю плюс, а там, конечно же, предлагают оформить подписку!
Пукан уже начинает выжигать кислород, но я пока не сдаюсь.
Если я уже вступил в группу, то система не идёт дальше и не применяет нужную роль, так может надо выйти и вступить по правильной пригласительной ссылке от плюса?
Снова переключаюсь на папин акк, захожу в настройки семьи, пытаюсь исключить себя, и мой пукан моментально начинает процесс преобразования водорода в гелий.
Что же случилось, думаете вы?
А случилась маленькая приписка примерно такого содержания: "Участник сможет снова вступить в семейную группу после 7 мая".
То есть ситуация следующая: я хочу затестить яндекс музыку, для которой нужен плюс, я хочу пошарить этот самый плюс с другого аккаунта, эти аккаунты находятся в семье, но пошарить нихера нельзя, потому что правильная ссылка не работает пока я в группе, и после выхода из группы она тоже не сработает, потому что до 7 мая меня никуда уже не пустит!
И уже морально приготовившись к подключению плюса себе на акк, я выкинул себя из группы, зашёл в плюс, отправил приглашение, перешёл в свой профиль, открыл почту, перешёл по ссылке...
И вот оно просто вот так вот взяло, вот так вот раааз...
И сука сработало! Я снова оказался в семейной группе!
И более того, у меня активировалась подписка на плюс!
И у меня даже активировался доступ Шрёдингера к яндекс 360!
Выглядело это как-то так, цитата из письма: "Вы присоединились к семейной группе Яндекс ID и можете пользоваться семейной картой и подписками на Яндекс Плюс и Яндекс 360 Премиум"
Вроде доступ есть, окей, открываем батин профиль, настройки семьи, а там: "Семейная оплата Поделиться картой", "Яндекс 360 Премиум Поделиться преимуществами".
Тут уже пофиг на самом деле, эти фичи мне не нужны, закрываю сей ужас и морально готовлюсь к новому этапу квеста: установке приложения, но это теперь уже завтра...
Собираемся интернет-провайдера менять, ТТК настойчиво предлагают свои услуги, есть у кого отрицательный / положительный опыт их использования? Будет круто, если поделитесь.
Или может тарифы сейчас у кого-нибудь есть хорошие по цене?
Вы, наверное, уже и не ждали, но всё же дождались. В Android-клиенте Телеграм пофиксили отвал нижней части экрана после записи гс.
Спасибо за внимание.
👍2
Личный кабинет налогоплательщика физического лица спрятан от скринридеров

Зашёл на lkfl2.nalog.ru, авторизовался, загрузился типа пустой документ.

Открываю, значит, исходник:
<body data-theme="light" class="ReactModal__Body--open" aria-hidden="true">


В общем-то на этом всё, я не знаю, как это можно прокомментировать.

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

UPD2:
Кажется это вылечивается после прохождения обучающего тура, но среднестатистическому пользователю и этого хватит.
Обновления дополнений для NVDA

Я являюсь автором / соавтором некоторых дополнений, которые отвалились сначала при выходе NVDA 2024.1, а потом ещё раз отвалились после выхода 2024.2.

К сожалению на официальное распространение дополнений через магазин NVDA пока нет времени, но сюда выложу рабочие версии.
Ball bouncer

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

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

Во-первых кто такие мы? Мы — это команда Sooslandia games, которая занимается разработкой звуковых игр.

И первым нашим продуктом стала аркадная игра Ball bouncer, которая была выпущена 14 июня для Windows и Linux.

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

В начале игры вы бросаете мяч, который летает по полю, сталкивается с объектами и разрушает их, за что вы получаете очки.

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

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

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

Ну или не научитесь, откуда же мне знать 😊

Вот вам ссылочки, вы знаете, что с ними делать:
Наш русскоязычный канал, наш интернациональный канал, скачать игру для Windows, скачать игру для Linux.
👍1
Небольшой интересный факт: это валидный код на Python.

def main():
return(42)


Живите теперь с этим.
aidaMenu-0.0.1.nvda-addon
4 KB
Aida Menu

Сделал дополнение, которое позволяет открывать меню в седьмой версии Aida64.
Не каждому это нужно, но если, например, хотите запустить тесты, или что-нибудь настроить, это дополнение может вам помочь.
Для открытия меню по умолчанию используется сочетание nvda+o.
Команда для выполнения бэкапа в twrp хорошо описывает жизнь любителей кастомных прошивок.

Чтобы создать резервную копию разделов boot, data и system, нужно выполнить twrp backup bds.

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

И в таком случае команда принимает вид twrp backup bdsm.

На сегодня пока всё.