Голос из-под шторки | Миша Левченко


Гео и язык канала: Россия, Русский
Категория: Технологии


Продуктивность разработки, вайб-инжиниринг, обзоры книжечек, мемы и жиза от @themishkun

Связанные каналы  |  Похожие каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций


Миф о субсидированных подписках

Люди часто подсчитывают количество токенов, которые они получают по подписке на ии-инструменты, перемножают на стоимость токенов по api, и называют какие-то безумные суммы в тысячи долларов, которые, якобы, полностью субсидируются AI компаниями. Чтобы что? Захватить рынок, показать рост перед инвесторами и привлечь ещё больше деняг на ещё больше субсидированных подписок, конечно! Типа всё это пузырь либо мышеловка и однажды всех заставят платить по ценам API.

Так вот, это всё неправда, вернее, не совсем правда.

Вот представьте, я сейчас создам канал "Голос из под занавески". Там самые классные посты в телеге (есть бенчмарки), но я с вас буду брать 1000 рублей за 100 символов. Дорого? Ну ладно, тогда можно будет за 2000 рублей купить подписку и читать 7 постов в неделю. Посты будут на 500-600 символов, это ж какая э-ко-но-ми-я! Я покрою эти убытки из своего кошелька, но только ради вас, люимая аудитория, чтобы вас набрать побольше. Звучит выгодно?

Точно так же anthropic и openai пользуются закрытостью своих моделей и ставят цену на API какую им угодно. А точнее, какую можно выдавить из корпораций на текущем уровне хайпа. А у кого ещё ты арендуешь sol 6.1 или opus 5.5? То-то же

Для того чтобы убедиться, что всё действительно так, давайте немного ферми-математики, которую я тут накидал с агентиком по открытым источникам:
- Токены deepseek 4.1 flash стоят по API в зависимости от методики расчёта, кеширвоания или нагрузки где-то от 15 до 50 раз дешевле чем gpt-5.5 или Sonnet 5, на которые он плюс/минус похож по бенчмаркам.
- Кто-то подсчитал что подписка codex за 20$ давала около 500$ по ценам API. При workloads соответствующим обычной кодинговой разработке это выливается в что-то около 400М токенов.
- Угадайте сколько стоит 400М токенов дипсика по API? Те же самые 10-20$ в зависимости от on-peak/off-peak.

Да, настоящие циферки наверняка чуть другие, но я уверен, что они как минимум выходят с подписками в 0. Особенно openai, которые разрешают свою подписочку использовать в сторонних продуктах. Миф о том, что каждая подписка приносит компании убытки на тысячи долларов, потому что столько же стоит эквивалент объёма по API, должен умереть. А вместе с ним и страх что лафа когда-то закончится. Потому что никакой лафы нет, ты за 500 долларовую подписку покупаешь токены не дешевле себестоимости а, скорее всего, даже приносишь неплохой доход компании-провайдеру.

462 0 9 13 13

С тем что мы теперь в индустрии код не читаем я давно согласен и очень даже рад этому. Наконец то можно действительно выбирать оптимальный стек под задачу, а не натягивать kotlin на multiplatform 😎

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

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

Поэтому прошу вас, соблюдайте золотое правило письменной коммуникации человекчеловек:

создание письменного текста должно занимать больше времени чем его прочтение и осознание


Ну и в конце концов, сделайте уже себе скилл speak-like-me, показав агенту примеры своих текстовых сообщений в до-AI-ную эру (они же у вас есть? Хоть домашки свои по русскому со школы закиньте, хуже не будет). Хоть чуть чуть постарайтесь, блин. Когда не сразу видно что это высер нейронки, не так обидно.


Slop Driven как методика ревью PR?

Мой старый (и старший) коллега по Авто.ру описал подход, очень похожий на то что я описал в spec-driven, но чуть более радикальный. Он предлагает просто просить модельку вместо саморевью переписать прку с нуля "нормально" и это работает.
https://t.me/dumch_code/220

1.5k 1 21 14 17

Jev Moment

Если хоть чуть чуть следите за темой "чо там за новые LLMки вышли на этой неделе", то наверняка слышали про новую неLLM от стартапа typesafe.io — Jev.
Если кратко — то это универсальный классификатор (или switch-case, тут уж у кого какой cs бэкграунд), который не нужно дообучать. Достаточно дать исходный текст и варианты ответа, шкалу оценки или просто вопрос на который можно ответить да или нет — и получаешь ответ. И всё это за долю времени и компьюта, который бы на эту задачу потратила LLM.

У меня супер большие надежды на этот инструмент, потому что последний год лучший ответ на применение LLM в тулинге был — возьми codex/cc/opencode/pi, дай ему скиллы, засунь в песочницу и дальше подливай токенов да эваль каждую новую модель и слово в скилле. Т.е. LLM-агент и был тем самым решением.

Jev же встраивается в ваш инструмент, просто давая ему возможность справиться с нечёткостью там, где это нужно. И делает это достаточно недорогим и быстрым, чтобы гонять на каждый чих. Проект, который я пытался собрать с wayfinder в предыдущем посте — дебаггер агентских сессий, где я пытаюсь подсветить какие-то частые проблемы, а ещё — дать возможность грепать эти сессии простыми вопросами типа "а где агент проигнорировал инструкции нашего скилла и сделал Х". Но этот проект всё ещё в состоянии "15 закрытых ишшью, 100 успешных unit-тестов, ни одного успешного запуска пользователем". Но в целом, жду появления тонны jev-based тулинга.

Пока агент правит основной пет, я собрал на коленке другой фан проект — @judge_jev_bot. Это простая обёртка над апи jev, которым можно осудить посты и сообщения своих друзей. Просто тегни бота в реплае, чтобы классифицировать сообщение собеседника. Бот попытается выделить категории ответа из текста твоего сообщения: перечислений или списков. Либо если вопрос содержит 1 категорию, например "это правда?", бот ответит про принадлежность к ней. Закинул 20$, развлекайтесь =)


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


Slop Driven Development > Spec Driven Development
aka Agile > Waterfall

Я в очередной раз начал испытывать FOMO, что не использую этот ваш Spec Driven Development. Почему-то я решил что с прошлого раза что-то поменяется, тем более в этот раз я взял вроде бы совсем уж лайтовый wayfinder от matt pocock. Спойлер: ничего не изменилось. Результат после 3-4 часов за компом и почти 1М токенов:

- 2 макета
- 10 ишшьюсов с тоннами текста в них
- 1 здоровенная спека, которую я не читал, потому что
- ресурс моего внимания исчерпался уже на втором часу
- а на третий меня стало тошнить от эмодзи ❓

Сам агент радостно пыхтит делает всё что ему сказали в непротиворечивой и вылизаной до блеска спеке. Получится ли так что результат не надо будет доделывать или что хотя бы базовая функциональность будет точно-точно работать? Сомневаюсь.

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

ЛЛМка не знает что важно а что не важно. Поэтому никакого прогрессивного раскрытия сложности нет. На слишком много вопросов ответ "мне пофигу, если так не сработает — чёт придумаем потом". Чтобы знала — нужно чтобы у неё появился вкус. А если у модели появится вкус — то ей можно просто написать "сделай красиво". А так получается что спека на 80% состоит из никому не нужного байкшеддинга.

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

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

Про хранение спек молчу. Тесты > тексты. И всегда так было.

Ну и самое главное — по моему опыту в среднем 2-3 часа нужно что планировать прежде чем что-то сделать. Где мой дофаминчик? Где моё моментальное вознаграждение? Я иишку оплачиваю, чтобы всё по мановении руки делалось, а не чтобы жеско пыхтеть часами прежде чем увидеть результат.

В этом, кстати скилл Мэтта мне понравился гораздо больше, чем эти ваши опенспеки и gsd — в какой то момент агент отстал от меня со своими вопросиками и сделал парочку макетов и прототипов и просто попросил выбрать что больше выглядит как правда. Вот бы так с самого начала. Первые прототипы, я думаю, можно было сделать уже после первых 15 вопросов. И сэкономить мне кучу времени. А ещё лучше было бы сразу нафигачить хоть как-то работающее решение, а потом уже подпиливать шероховатости до хорошего состояния...but wait, это же мой вариант SDD — Slop-Driven-Development!


Коллеги попросили меня позвать вас на Глубокую Ночь Технологий (Ночь Глубоких Технологий?), которая будет уже в эту субботу (внезапно — днём).

А я только рад помочь, ведь программа супер. Про ai-кодинг я немного устал слушать, но слава богу там этого почти нет. Сам подключусь посмотреть доклады про Лавку и physical AI, ищите меня в чатике (надеюсь чатик будет без регистрации и смс, а то наши деврелы такое любят)




Кстати, пока мы на клавиатурной теме. Если пользуетесь макбуком недавно — помните, что option, это не совсем alt. Это довольно мощный инструмент для набора символов, которых на клавиатуре не видно. Таких как длинное тире, кавычки-ёлочки, знаки валют, диакритика и всякое такое. А ещё — можно не переключаясь на другую раскладку набирать сербские буквы — њ, љ, џ, ђ, ћ и ј и, внезапно, белорусскую ў (при этом і там нет). Прикол?


Без этой программы мне физически тяжело пользоваться макбуком
В прошлом посте я обещал рассказать что же стало настолько важной частью моего сетапа, что без этого я испытываю боль. Долго тянуть не буду — это Karabiner Elements.

Знаете этих любителей миниатюрных механических клавиатур? Их любимый вопрос от аутсайдеров хобби — "а как набирать цифры"? На который они готовы часами обьяснять про слои, mod-tap и другие фичи прошивки этой клавиатуры. И будут рассказывать, что если зажать клавишу, то клавиши тьболдгшщ превращаются в 123456789. Или что если нажать на ctrl и быстро отпустить то будет esc.

Так вот, чтобы получить доступ ко всем этим извращениям не нужно покупать клавиатуру на QMK/ZMK. Достаточно установить Karabiner Elements. Несмотря на то что я тоже любитель этой важей эргомеханики и уже 7 лет использую 60% сплит клавиатуру, большинство этих модификаций у меня работают именно на программном уровне, а не на уровне прошивки клавиатуры. Так я сохраняю рассудок, когда переключаюсь между своей домашней механикой и клавиатурой ноута вне дома.

Какие у меня включены модификации
Capslock — esc при нажатии, ctrl при удержании. Наверное одна из самых важных модификаций. Capslock — клавиша абсолютно бесполезная в современном мире и пригодится, только если ВЫ ОЧЕНЬ ЗЛЫ И ХОЧЕТСЯ ВЫПУСТИТЬ ПАР. Ну или хотите аутентично писать на SQL, BASIC или COBOL. При это находится она в очень удобном месте прям под мизинцем. А ctrl и esc — наоборот, клавиши очень полезные, но находящиеся на неудобных местах, до которых приходится далеко тянуться. Поэтому этот размен очевиден.

Hyper key. Так как ctrl переехал на capslock, у нас освободилась клавиша в не самом удобном, но неплохом месте. Такое добро разбазаривать нельзя! Поэтому на него я вешаю hyper key — если нажать на эту клавишу, то это считается как нажатие ВСЕХ модификаторов. Так как никому в голову не придёт вешать хоткеи на такое, это free real estate для того чтобы создавать глобальные модификаторы. У меня на них выставлены команды Raycast: открытие окон, вызов экстеншнов и всякое такое.

Right cmd + hjkl как стрелки. Это одна из самых первых модификаций, которые я себе поставил. На моём сплите выделенных стрелок нет. А на макбуке они опять же очень далеко от того положения в котором руки набирают текст. Сначала у меня была модификация jikl как стрелки, но потом я освоился с вимом и мне стало гораздо привычнее hjkl.

Инвертированные цифры. Обычно на маке хочешь набрать @ — жмёшь shift + 2. У меня наоборот, чтобы набрать двойку, нужно жать shift + 2, а просто нажатие на 2 даёт @. Зачем так? Во-первых, цифры нужны не часто, а символы — довольно часто. Во-вторых, цифры я набираю на numpad-like раслкадке, активируемой по fn. Как раз на тех самых тьболдгшщ.
Rolling shift — левый и правый shift вводят ( и ) соответственно, если их нажать и отпустить. Крайне полезная штука, особенно для таких lisp enjoyer как я. Иногда бывает раздражает когда зажал шифт и передумал нажимать хоткей/вводить букву и вводится скобка. Но я привык удерживать 200мс чтобы оно считало это за модификатор.

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


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

Homebrew
Первая же команда которую выполняешь на любом макбуке после того как обновляешь систему и устанавливаешь xcode-select --install — это поставить brew. За редким исключением в виде игр стима и корпоративных программ, всё что стоит на моём макбуке — всё поставлено и управляется через brew. Поэтому я просто дампнул на старом ноуте Brewfile, удалил оттуда программы, которыми я не пользуюсь и поставил всё из него brew bundle --file Brewfile. Кстати этим же способом можно поставить приложения из AppStore, а также go/cargo/uv пакеты.

Chezmoi
Вот поставили мы все программы — а с конфигурацией что делать? Руками копипастить конфиги? Завести всю home директорию под git? Лучшее решение — использовать dotfiles менеджер. Почему так называется? Потому что конфиги обычно лежать в домашней директории в папочках начинающихся с точки. .gradle, .config, .zshrc — вот эти все ребята. Я раньше пользовался Stow для такого, но давно хотел переехать на chezmoi и вот представился повод. Восстановить все конифги = скачать приватный гит репозиторий со всеми моими настройками и прожать chezmoi --source ~/.dotfiles apply. Прелесть chezmoi что он не только прилинкует файлы конфигурации но и вызовет нужные команды для сетапа.

Zinit
Chezmoi конечно менеджер конфигов, но для zsh нужен свой удобный фреймворк конфигурации. Чтобы были комплишены и нормальный поиск по истории. Кто-то ставит себе oh-my-zsh или zsh-for-humans. Я же терпеть не могу эти миллионы алиасов которые они насыпают. А ещё миллисекунды которые они добавляют на старт шелла. Поэтому я пользуюсь zinit и уже раньше писал про него в канале.

Asdf
Раз уж мы говорим про всякие менеджеры конфигураций, не могу не упомянуть asdf — под таким дурацким названием скрывается менеджер SDK и рантаймов. С небольшой конфигурацией он будет с лёгкостью одной и той же командой обновлять и переключать хоть текущую джаву, хоть ноду, хоть питон.

macos-defaults. sh
Это просто скрипт который выставляет настройки в system settings. Биндинги клавиш и всякое такое. Я обычно прошу это сделать агента, чтобы ещё и обновил этот скрипт. А то некоторые штуки очень легко потерять при переезде и потом искать.

На этом на сегодня всё, в следующих постах расскажу что же я оставил в своём Brewfile как абсолютно необходимое для работы. Честно говоря без одной из этих программ я вообще как без рук, мне физически тяжело пользоваться макбуком. Угадаете — какой?


Репост из: Baddies Book Club
тимлиды, не верящие в гномов-овертаймеров, такие: «наверное, этот техдолг уменьшился сам»




Наверное поворотным событием в моей жизни было 9 лет назад подать заявку в Школу Мобильной Разрабоки в Яндексе. Я был второкурсником и мой однокурсник Саша подался туда и позвал меня с собой. Андроид приложение до школы я разрабатывал только одно. И то, скорее какую-то его часть на студенческом хакатоне. Ну и джаву почти не знал. Мне в то время больше нравился питон. Помню как решил не ходить на пары и неделю делал тестовое, не вылезая из комнаты. Кое-как прошёл и мне купили самолёт в Москву и поселили в хостеле с другими иногордними участниками школы. И мне кажется что иногородним гораздо больше повезло, чем москвичам, потому что я на пару месяцев только и делал что учился разрабатывать android приложения. Когда вокруг столько талантливых, увлеченных ребят, сам начинаешь ощущать себя талантливым и увлечённым. Помню ещё что для меня было сюрпризом что в конце были какие то собесы и меня даже наняли в авто.ру (вау!). Я думал что в сентябре 2017 всё закончится. А оно только начиналось.

Это я к чему, если вдруг кому нужно, то есть ещё неделя и до 3 мая можно забить на пары и успеть выполнить тестовое. В этом году школы по направлениям бек, мобилка, фронт и фуллстек
https://yandex.ru/yaintern/schools/summer




Репост из: LLM под капотом
Анализ кода агента с первым местом в слепом прогоне BitGN PAC1

Итак, Operation Pangolin получил первое место в слепом прогоне в Accuracy Leaderboard (поделил его с codex-on-rails)

Что у него под капотом? Это не столько чат-бот агент, сколько компактный программируемый аналитик со строгим чеклистом и REPL циклом.

Ядро написано на TypeScript. Там вызывается Anthropic Claude (для отладки - Sonnet, для соревнования - Opus). Причем у LLM-ки есть не куча инструментов, а только один - execute_code. То есть LLM-ка генерирует код на Python, который получает доступ к инструментам рантайма через класс Workspace, а еще памяти (scratchpad) и словарику с переменными. Результаты работы передаются обратно в Claude. Повторяем, пока код в итоге не выдаст ответ через ws.answer(scratchpad, verify), который успешно пройдет встроенную верификацию.

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

Слабые места решения (классы задач, на которых архитектура ломалась) - это:
- спрятанные в документах вредоносные инструкции, например t011
- удаление пачки файлов - t006
- кейсы, когда мы описываем сущности и проекты (и нужна LLM-ка, чтобы их найти) - t025, t051
- работа с датами, например t012, t037

Но при всем при этом, решение заняло первое место и показало результат лучше более сложных систем. Чтобы повторить в своем решении:

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

Автор Operation Pangolin - @i_november!

Поздравляю с первым местом в соревновательной части BitGN PAC1! Решение заняло первое место в Accuracy Leaderboard (87 очков, поделили с codex-on-rails) и с первым местов в Ultimate Leaderboard (92 очка). Исходники - в GitHub.

Задавать вопросы автору можно прямо в комментариях к посту. Туда же я скину график, который сравнивает поведение этого агента с запусками всех других агентов в соревновательном прогоне.

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

Ваш, @llm_under_hood 🤗


Архитектура в итоге была выигрышная! А говорят в эпоху агентов скилл ничего не решает и любая идея имплементируется на раз-два


Как занять последнее место в соревновании агентов

Сегодня я принял участие в сорвеновании по разработке агентов BITGN-PAC1 от @llm_under_hood. И занял последнее место в локальном лидерборде в Белграде. Мой слон правильно решил 9/104 задач. Как прийти к успеху, как я:

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

Второй ключ к успеху – запустить агента как джина с указанием в плане "выбить 43/43 тестового датасета". Утром пятницы у меня был готов "агент" выбивающий 43/43. Но было две проблемы:
1. там не было ни одного вызова LLM
2. Выбивал он их регулярками на датасете который он скачал, чтобы быстрее итерироваться

Третий ключ к успеху – незнакомая архитектура. Помните я писал про RLM и pi? Я подумал что соревнование – отличный повод опробовать на практике штуку, с которой я раньше не работал. У меня не было достаточно опыта, чтобы хорошо описать архитектуру и времени, чтобы много итерироваться. Например, только сегодня я обнаружил, что агент всё время пытается решить задачу за один проход, игнорируя точки останова, которые я ему дал чтобы исследовать проблему и потом уже придумывать алгоритм решения.

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

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

Ещё один классный инсайт от одного из участников Виталия – поговорить с агентом на тему "как мыслить о такой задаче". Заметапромптить самого себя, так сказать. Это бы помогло подсветить заранее риски, возможные проблемы и, например, указать мне на тот факт, что задачи можно сабмитить на платформу параллельными воркерами.


В моём инфополе все вчера так возбудились сливу исходников claude code, что не заметили что утекло ещё кое что
https://huggingface.co/anthropic/Claude-Opus-4.6


Как сделать доклад так, чтобы тебя запомнили?
Сделать его авторским.

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

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

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

И мне кажется, что это достойный творческий подход. Познакомить зрителей не только с концепцией, которую хочешь обьяснить, но и с какими-то произведениями, которые тебя вдохновляют. Это и есть то самое "вложить душу".

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

Показано 20 последних публикаций.