{"version": "https://jsonfeed.org/version/1.1", "title": "Рубанов про мобилу", "home_page_url": "https://t.me/RubanovMobile", "feed_url": "https://tg.davvie.com/static/RubanovMobile.json", "description": "Рубанов про мобилу", "items": [{"id": "https://t.me/c/1240749873/1225", "url": "https://t.me/c/1240749873/1225", "title": "Пирамида тестов по покрытию  Пока готовился к Подлодке сделал слайд с анализом покрытия тестами внут", "content_html": "<strong>Пирамида тестов по покрытию</strong><br /><br />Пока готовился к Подлодке сделал слайд с анализом покрытия тестами внутри одного модуля. Пирамиду строил обратную: не по количеству тестов, а по степени покрытия, чтобы увидеть какой слой тестов какой импакт дает в целом. <br /><br />Поделил на несколько слоев + измерил какое покрытие дают тесты такого типа (бледно) и сколько уникального покрытия на них приходится (ярко). <br /><br />Вышло так:<br />• <strong>Общее покрытие</strong> в модуле — 81%. Не покрыт роутинг экранов и пара вьюшек с видео.<br />• <strong>Скриншот-тесты</strong> вьюшек дают 46%. Вьюшки проверяют и логику смены состояния во вьюмодели, поэтому через Prefire можно быстро покрыть половину кода только по превьюшкам. 30% уникального покрытия, что не получится зацепить другими тестами. <br />• <strong>Компонентные тесты</strong> покрывают 46%, дополнительно к вьюшкам это тестирует еще 17% кода. Они проверяют сценарии: тестируют координатор модуля, но так, чтобы еще вызывался код вьюмоделей по загрузке и действиям пользователя.<br />• <strong>Вьюмодели</strong> иногда нужно протестировать независимо: как фейлится загрузка, дополнительная логика внутри экрана. Много кода протестировано прошлыми тестами, поэтому тут лишь дополнительные 2.6%. Но если бы писали только такие тесты, то это бы покрывало 30% логики. <br />• <strong>Отдельные юнит-тесты</strong> по форматированию, обработке операций и т.п. Почти ничего не меняют глобально, но нужны по узким кейсам. <br />• <strong>UI-тесты</strong> не измерял, потому что не пишу их сейчас, но там скорее всего сумма скриншот-тестов и компонетных.<br /><br />Это оценка поверх подхода к тестам, про которые рассказываю в книге: писать тесты так, чтобы повторять пользовательские сценарии, а не архитектурное деление на классы. Следствием идет большое покрытие, небольшое количество тестов. Не хорошо и не плохо, просто такой подход<br /><br /><a href=\"https://bookshelf.dev/testing-book\">https://bookshelf.dev/testing-book</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1225-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-16T13:49:40+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1225-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1224", "url": "https://t.me/c/1240749873/1224", "title": "За выходные книжку никто не купил, поэтому решил подарить тем, кто первыми купил мои книги: • z…y@gm", "content_html": "За выходные книжку никто не купил, поэтому решил подарить тем, кто первыми купил мои книги:<br />• z…<a href=\"mailto:y@gmail.com\">y@gmail.com</a> <br />• p…<a href=\"mailto:v@gmail.com\">v@gmail.com</a><br /><br />Письма уже отправил, проверяйте спам, мало ли.", "date_published": "2026-09-14T13:04:20+00:00"}, {"id": "https://t.me/c/1240749873/1223", "url": "https://t.me/c/1240749873/1223", "title": "Видосик для App Store  Давно хотел сделать видос, но было несколько проблем: Непонятно как показать ", "content_html": "<strong>Видосик для App Store</strong><br /><br />Давно хотел сделать видос, но было несколько проблем:<br />Непонятно как показать<br />Непонятно чье лицо использовать. <br /><br />При этом у видео есть прям задача: я хочу показать, что приложенька работает с видео из соцсетей. Ну так и покажем: попался нейровидос про смену причесок, в качестве аватара взял сгенерированную девушку с аватарки приложения, ускорил процесс, чтобы не так скучно было ждать процессинг. Готово.<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1223-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1223-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-09-12T12:00:45+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1223-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1222", "url": "https://t.me/c/1240749873/1222", "title": "В итоге вышло, что Клод сам свою подписку окупает", "content_html": "В итоге вышло, что Клод сам свою подписку окупает<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1222-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-12T11:29:24+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1222-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1221", "url": "https://t.me/c/1240749873/1221", "title": "Face Replace 2.0  В феврале я попробовал эксперимент: насколько сложное приложение получится написат", "content_html": "<strong>Face Replace 2.0</strong><br /><br />В феврале я попробовал эксперимент: насколько сложное приложение получится написать не притрагиваясь к коду. Результат выдающийся. <br /><br />В августе решил проверить: может быть обновленный Клод сможет что-то улучшить? Попросил Опус поревьювить пайплайн и он впервые предложил понизить битность модельки. Это типо насколько точно пиксели считаются, но визуально разницы почти нет, зато размер моделей, занимаемая память, скорость выполнения и нагрев устройства уменьшились в два раза! По ощущениям сильно приятней приложением стало пользоваться. <br /><br />На таких радостях снизил цены в 2 раза, я же человек. <br /><br /><a href=\"https://apps.apple.com/us/app/face-replace-ai-on-device/id6759573300\">https://apps.apple.com/us/app/face-replace-ai-on-device/id6759573300</a><br /><strong>The video is too large.</strong>", "date_published": "2026-09-12T11:29:23+00:00"}, {"id": "https://t.me/c/1240749873/1220", "url": "https://t.me/c/1240749873/1220", "title": "Ревью Apple и психологическое насилие  В прошлый раз писал что на ревью какая-то новая тема появилас", "content_html": "<strong>Ревью Apple и психологическое насилие</strong><br /><br />В прошлый раз писал что на ревью какая-то новая тема появилась: брать приложение в ревью и не принимать решение. Так случилось, что у Face Replace обе версии одновременно так попали. <br /><br />В этот раз решил проверить сколько такое может длиться: отправил сборку первого сентября, вчера было 11. <br /><br />Ну я отменил, отправил снова и прожал экспедит ревью, пропустили за 2 часа. Ну как так то<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1220-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-12T11:28:32+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1220-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1219", "url": "https://t.me/c/1240749873/1219", "title": "У меня есть две проходки на Подлодку Крю про ИИ, разыграю между всеми кто покупал книжки на https://", "content_html": "У меня есть две проходки на Подлодку Крю про ИИ, разыграю между всеми кто покупал книжки на <a href=\"https://bookshelf.dev\">https://bookshelf.dev</a><br /><br />Прошлые покупки тоже считаются. Успевайте до понедельника, тогда и подведем итоги<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1219-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-11T12:22:59+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1219-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1218", "url": "https://t.me/c/1240749873/1218", "title": "Фолдебл-телефоны: существуют Apple: открывает дверь с ноги", "content_html": "Фолдебл-телефоны: существуют<br />Apple: открывает дверь с ноги<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1218-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1218-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-09-10T00:26:19+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1218-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1217", "url": "https://t.me/c/1240749873/1217", "title": "Десять лет всем запрещал писать кастомную навигацию.   Сегодня вознагражден", "content_html": "Десять лет всем запрещал писать кастомную навигацию. <br /><br />Сегодня вознагражден<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1217-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-10T00:23:35+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1217-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1216", "url": "https://t.me/c/1240749873/1216", "title": "Делаем?", "content_html": "Делаем?<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1216-0.jpg\" alt=\"media\"/>", "date_published": "2026-09-10T00:16:40+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1216-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1215", "url": "https://t.me/c/1240749873/1215", "title": "Мой прогноз на презу и покупки:  • Через год куплю 17 Про, потому что будет достаточно дешевый, а ба", "content_html": "Мой прогноз на презу и покупки: <br />• Через год куплю 17 Про, потому что будет достаточно дешевый, а батарейка в 16 Про окончательно задолбает<br />• Жене куплю 18 базовый тоже через год, по тем же причинам.<br /><br />Че там среди новых телефонов будет даже не важно", "date_published": "2026-09-09T16:59:43+00:00"}, {"id": "https://t.me/c/1240749873/1214", "url": "https://t.me/c/1240749873/1214", "title": "", "content_html": "", "date_published": "2026-09-04T13:40:36+00:00"}, {"id": "https://t.me/c/1240749873/1213", "url": "https://t.me/c/1240749873/1213", "title": "🧭 Podlodka iOS Crew: разработка с AI    С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В", "content_html": "🧭 <strong>Podlodka iOS Crew: разработка с AI  </strong><br /><br />С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В этот раз в центре внимания авторов конференции то, как AI меняет iOS-разработку.<br /><br /><strong>Что ждёт участников</strong>:<br /><br />🍏 <strong>Стратегия внедрения терминальных ИИ-агентов и MCP-интеграции</strong> в ежедневную iOS-разработку<br /><br /><strong>🍏</strong><strong> AI как экзокостюм мобильного разработчика:</strong> harness, skills, CLI, orchestration, validation и evals<br /><br /><strong>🍏</strong><strong> Знания о том, как запускать локальные модели</strong> на Apple Silicon<br /><br /><strong>🍏</strong><strong> Готовые скрипты, которые можно забрать в свой проект: </strong>шаблон рабочего пространства агента, примеры скиллов и MCP, пайплайн от Jira-задачи до Merge Request.<br /><br />И это ещё не всё! Подробности о сезоне смотрите на сайте, и там же есть билеты по early-bird цене. <br /><br />👉 <a href=\"https://podlodka.io/ioscrew?utm_campaign=early_bird_ios_crew_18&amp;utm_source=telegram&amp;utm_medium=paid&amp;utm_content=iosgr&amp;erid=2SDnjdLTCD9\"><strong>Билеты на Podlodka iOS Crew</strong></a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1213-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1212-1.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1211-2.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1210-3.jpg\" alt=\"media\"/>", "date_published": "2026-08-31T14:10:28+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1213-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1212-1.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1211-2.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1210-3.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1209", "url": "https://t.me/c/1240749873/1209", "title": "Расскажу про тесты на Подлодке Крю   Никогда такого не было, но снова есть что рассказать про тестир", "content_html": "<strong>Расскажу про тесты</strong> <strong>на Подлодке Крю </strong><br /><br />Никогда такого не было, но снова есть что рассказать про тестирование через призму ИИ:<br />- Как тестирование становится бутылочным горлышком.<br />- Как тесты выглядят в 2026 году.<br />- Как перейти от ревью кода к ревью артефактов. <br /><br />Промокод RubanovMobile даст скидку 500 рублей.", "date_published": "2026-08-31T14:10:27+00:00"}, {"id": "https://t.me/c/1240749873/1208", "url": "https://t.me/c/1240749873/1208", "title": "Спасибо за предложения, нашли победителя!  plannotator.ai  Делает ровно то, что я искал: запускает в", "content_html": "Спасибо за предложения, нашли победителя!<br /><br /><a href=\"plannotator.ai\">plannotator.ai</a><br /><br />Делает ровно то, что я искал: запускает в вебчике ревью локального кода, умеет показывать артефакты и дает оставить комментарий к любой строчке, после чего агент продолжит работу. <br /><br />Я использую cmux и он умеет вебчик открывать параллельно во вкладке, все в одном месте<br /><br />Если артефакты ревьювить не надо и хочется терминальный интерфейс, то ближайший будет <a href=\"https://github.com/umputun/revdiff\">https://github.com/umputun/revdiff</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1208-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-29T18:19:16+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1208-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1207", "url": "https://t.me/c/1240749873/1207", "title": "Локальное ревью коммитов  Понял что мне нужна приложенька для параллельного ревью по коммитам. Предс", "content_html": "<strong>Локальное ревью коммитов</strong><br /><br />Понял что мне нужна приложенька для параллельного ревью по коммитам. Представляю так, что агент что-то пишет, а в соседнем окне я могу смотреть поток ченджей и артефактов (результаты скриншот-тестов, например) и если надо, то возвращать агента поменять что-то, если он меня неправильно понял. Ну и отмечать коммиты как локально-отревьювленный, например. <br /><br />Т.е. не процесс ревью, который привязан к веткам и пулреквестам где-нибудь в гитхабе, а локально покоммитно. Не встречали такое?", "date_published": "2026-08-27T13:28:12+00:00"}, {"id": "https://t.me/c/1240749873/1206", "url": "https://t.me/c/1240749873/1206", "title": "Пару человек просили добавить оплаты, но от количества желающих зависит скорость и способ решения", "content_html": "Пару человек просили добавить оплаты, но от количества желающих зависит скорость и способ решения", "date_published": "2026-08-23T10:29:40+00:00"}, {"id": "https://t.me/c/1240749873/1205", "url": "https://t.me/c/1240749873/1205", "title": "Книга про Metal теперь полностью на русском  Из трех книжек Metal – бестселлер и теперь доступна на ", "content_html": "<strong>Книга про Metal теперь полностью на русском</strong><br /><br />Из трех книжек Metal – бестселлер и теперь доступна на русском. Если язык был преградой, то теперь Георгий Остроброд все перевел. <br /><br />В книге 25 глав про Metal: <br />• Разбор как связан девайс, буфер, текстура, пайплайн, команд-кью и команд энкодер.<br />• Как устроен процессинг и как получается итоговая картинка.<br />• Зачем нужны шейдеры и каких видов они бывают.<br />• Как интегрироваться в UIKit и SwiftUI.<br />• Как эффективно работать с памятью, дебажить, профилировать и добиться скорости.<br /><br />$50 или по подписке за $10 в месяц. Покупая получаете обе версии: на русском и английском. <br /><br /><a href=\"https://bookshelf.dev/metal-book/\">bookshelf.dev/metal-book</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1205-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-21T12:56:16+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1205-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1204", "url": "https://t.me/c/1240749873/1204", "title": "Релизный пинковоз  Иногда я делаю пет-проект и он мне надоел. Вот книгу писал, это сложно, медленно,", "content_html": "<strong>Релизный пинковоз</strong><br /><br />Иногда я делаю пет-проект и он мне надоел. Вот книгу писал, это сложно, медленно, долго. Спустя <em>год:</em> в целом структура готова, но какие-то последние главы дописывать еще надо, первые бы поправить, задач много, но сил уже нет. <br /><br />Тогда я выпускаю, чтобы пнуть самого себя по мотивации. <br /><br />Выходит несколько вариантов:<br />• Продается хорошо? Топ, надо выпустить еще, чтобы поблагодарить<br />• Продается плохо? Круть, надо выпустить еще, чтобы подогреть<br />• Не продается совсем? Круть, надо выпустить еще всем назло. <br /><br />Вот такая мотивация.", "date_published": "2026-08-18T12:34:51+00:00"}, {"id": "https://t.me/c/1240749873/1203", "url": "https://t.me/c/1240749873/1203", "title": "Главы про зависимости в книге Про тестирование на iOS  Дай мне сил принять то, что я не могу изменит", "content_html": "<strong>Главы про зависимости в книге Про тестирование на iOS</strong><br /><br /><blockquote>Дай мне сил принять то, что я не могу изменить, мужество изменить то, что я могу, и мудрость отличить одно от другого</blockquote><br /><br />Давно хотел написать про зависимости: с ними были огромные проблемы в Додо, много странных библиотек на гитхабе, неправильное понимание зависимостей в комьюнити и как следствие всего — тотальное непонимание как работать с ними в тестах и как вообще строить архитектуру. <br /><br />Оказывается, чтобы подобраться к теме пришлось написать книгу и сменить работу :D<br /><br />Дописал третий раздел в книгу: +5 статей, теперь их уже 12 и 1 туториал. Рассказываю про зависимости: <br />• в чем их особенность, <br />• какими инструментами с ними работать, <br />• как они превращаются в тест-даблы, <br />• и что такое «сделать прототип для исследования». <br /><br />По пути: почему я не использую моки, как добиться последовательного выполнения в тестах, как красиво падать и когда пригодятся параметризованные тесты.<br /><br />Показываю на примерах либ Dependencies и IssueReporting от Point-Free, если вы уже посматривали на эти библиотеки, то книга покажет их в действии. Еще упомянаются Sharing и Swift Clocks.<br /><br />В следующий раз расскажу как тремя способами работать с сетью и подберемся к тестированию экранной логики. <br /><br />$30 за книгу или $10 в месяц по подписке.<br /><br /><a href=\"https://bookshelf.dev/testing-book/\">bookshelf.dev/testing-book</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1203-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-17T11:53:40+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1203-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1201", "url": "https://t.me/c/1240749873/1201", "title": "Доступность файтинга  Марвел Токон вышел, плейстейшен купил, давайте про доступность файтингов погов", "content_html": "<strong>Доступность файтинга</strong><br /><br />Марвел Токон вышел, плейстейшен купил, давайте про доступность файтингов поговорим. <br /><br />У файтингов есть проблема — высокий порог входа. Я на этом даже заработал несколько тысяч долларов 10 лет назад продавая приложение со списком приемов для Мортал Комбат Х. Выходит файтинг по марвелу и у него сходу несколько проблем исходя из бренда и позиционирования.  <br /><br /><strong>Захотят играть дети.</strong> Моему сыну 7, начал играть с трех. Он хорошо читает, но в роликах за субтитрами в игре не успевает. Марвел токон сходу включает скринридер с описанием как перемещаться по меню. Но это я понимаю, что это скринридер, а для него это возможность не читать, но разобраться в игре начиная с первой кнопки. Круто! Конечно, полная локализация на русский в этом тоже помогает. <br /><br /><strong>Захотят играть гости.</strong> Типичная проблема: я прошел все обучение и знаю как работает игра, но вот ко мне завалились друзья которые игру видят впервые. Марвел токон сильно упрощает систему комбо: можешь нажать квадрат 3 раза и будет красиво. Нажми треугольник кнопку 3 раза и тоже будет красиво. Случайно нажми R2 в любой момент и будет мега-красиво. Легко начать играть не разбираясь. <br /><br /><strong>Захочется прокачаться.</strong> Но сильно упрощать управление нельзя, иначе станет скучно играть долго. Поэтому есть еще одна система управления, которая вызывает те же визуальные удары, но если выполнить «правильно», то урон будет выше. Прикольное усложнени для тех, кто шарит.<br /><br />В итоге подходит тем, кто еще даже не умеет читать или играет в файтинг впервые, но и оставляет механики для тех, кто любит поразбираться в игре. Отличный пример как доступность очень сильно расширяет аудиторию и напрямую влияет на продажи.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1201-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-14T12:32:33+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1201-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1199", "url": "https://t.me/c/1240749873/1199", "title": "Bookshelf.dev: новая книга — про автотесты на iOS  Сейчас у тестов вторая жизнь:  • ИИ может легко н", "content_html": "<a href=\"Bookshelf.dev\"><strong>Bookshelf.dev</strong></a><strong>: новая книга — про автотесты на iOS</strong><br /><br />Сейчас у тестов вторая жизнь: <br />• ИИ может легко написать любой тест;<br />• ему критически важны тесты, чтобы проверять результат работы;<br />• при этом разработчикам нужно как-то быстро понимать что в проекте вообще есть;<br />• но если вы не знаете каким тестом проверить задачу, то ИИ за вас это не придумает;<br />• вы все еще должны сделать тестируемую архитектуру, чтобы код вообще можно было протестировать!<br /><br />Выходит, что 4 из 5 пунктов я могу показать: как это выглядит, куда идти и как пользоваться. А вот последний пункт про архитектуру вы должны пройти сами, выбрав что вам нужно, что можно сделать сейчас и насколько вы готовы менять проект. Зато после книги конечная цель будет сильно понятней!<br /><br />Книга будет выходить постепенно, первые шесть глав уже доступны. <br />• Как тесты помогают масштабированию приложения.<br />• Примеры тестов в пирамиде тестирования. <a href=\"https://bookshelf.dev/testing-book/ru/documentation/book/mobile-testing-pyramid/\">Бесплатная глава</a> <br />• Как тесты и ИИ помогают друг-другу.<br />• Что приходится изменить в архитектуре.<br />• Что такое TDD-ката и туториал по ней. <br />• Что такое DSL<br /><br />Затем я расскажу про самые разные виды тестов (примеры в бесплатной главе) и к концу вы узнаете как написать стройную систему автотестирования без мок-фреймворка на сценариях использования приложения. <br /><br />Доступно на русском и английском, $30 вместо 50 пока книга пишется. <br /><br /><a href=\"https://bookshelf.dev/testing-book\">https://bookshelf.dev/testing-book</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1199-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-10T10:31:02+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1199-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1198", "url": "https://t.me/c/1240749873/1198", "title": "Итоги по автотестам  Когда я узнал про автотесты и что в Xcode есть целая панелька для них я очень з", "content_html": "<strong>Итоги по автотестам</strong><br /><br />Когда я узнал про автотесты и что в Xcode есть целая панелька для них я очень загорелся идеей научиться тестировать. Но все практики мне не понравились: непонятно как тестировать верстку, что делать с меняюшимся бэкендом, как тестировать сценарий который проходит через несколько экранов. Как в итоге это должно выглядеть было совершенно непонятно. <br /><br />При этом сталкивался и с проблемой внедрения в проект: для тестов нужно делать мифическую «тестируемую архитектуру». Значит, мне не только непонятные тесты нужно написать, но и проект под них перекроить! Задача стало очень сложной. <br /><br />Хуже того, проекты в которых я видел автотесты скатывались до мок-фреймворков и тестирования всех классов в изоляции. Попробовал — мне такое вообще не нравится и скорее даже делает хуже. <br /><br />В конце добивал еще и факт, что для быстрой работы с тестами надо поделить проект на модули и работать с ними по-отдельности. Т.е. в процессе работы над проектом по тестирвоанию надо сделать другой проект по многомодульности! <br /><br />Додо Пицца тогда активно росла: в количестве разработчиков, в сложности фич и инфраструктуры, выходила в новые страны,  усложнялись сценарии внутри приложения. У проекта сменилась команда и не так уж легко было узнать зачем какой-то код вообще был написан. Тестировать все равно надо. <br /><br />Потом у нас появилось пара стартапов: Дринкит и Донер 42. Очень хотелось сразу начать проекты нормально масштабируя наш опыт с тестированием, но новые команды категорически не хотели учиться тестам, ведь «тесты в стартапе не нужны». Ну да, ну да.<br /><br />И вот спустя 5 лет тестирование в Додо Пицце и 2 года тестирования в стартапе пора подводить итоге. Я выгрузил весь опыт из головы в виде книги: вы сможете посмотреть на самые разные виды тестов, подходы, практики и фреймворки, не абстрактными правилами «как хорошо», а реальным примерами из проектов.", "date_published": "2026-08-10T10:30:03+00:00"}, {"id": "https://t.me/c/1240749873/1197", "url": "https://t.me/c/1240749873/1197", "title": "И снова про ревью  Вторую неделю пытаюсь зарелизить приложение. Столкнулся с новыми приколюхами: • П", "content_html": "<strong>И снова про ревью</strong><br /><br />Вторую неделю пытаюсь зарелизить приложение. Столкнулся с новыми приколюхами:<br />• Прила 5 дней находится в статусе In Review<br />• Зареджектили, потому что не смогли найти встроенную в приложению проверку возраста. То, что все финансовые приложения проверяют это через KYC на онбординге ревьювер не в курсе, онбординг проходить не собирается. <br />• Не нашел пермишен на AppTrackingTransparency, хотя он показывается прямо при запуске приложения. <br />• Прислали письмо, что удалили приложение из Китая. Вот только приложение еще не доступно никому и доступность в Китае я сам отключил за два дня до этого.<br />• Прожимаю экспедит ревью чаще чем смотрю рилсы в инсте, но даже так это пара дней. <br /><br />Как у вас ревью последнее время?<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1197-0.jpg\" alt=\"media\"/>", "date_published": "2026-08-06T10:25:16+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1197-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1196", "url": "https://t.me/c/1240749873/1196", "title": "Впервые за полгода сел писать код руками и пришел к неутешительному выводу… а не, клод снова заработ", "content_html": "Впервые за полгода сел писать код руками и пришел к неутешительному выводу… а не, клод снова заработал, сегодня без выводов", "date_published": "2026-07-30T12:05:28+00:00"}, {"id": "https://t.me/c/1240749873/1195", "url": "https://t.me/c/1240749873/1195", "title": "Случайная синергия  Дважды за последне время произошли невероятные совпадения с тем, что делал я: - ", "content_html": "<strong>Случайная синергия</strong><br /><br />Дважды за последне время произошли невероятные совпадения с тем, что делал я:<br />- Георгий Остроброд думал как выпустить книгу,<br />- Матвей Мясоедов делал плагин для фигмы про доступность. <br /><br />В итоге и там и там заколлабились и зарелизили. Но каждый раз это было стечением обстоятельств в духе «в комментах случайного поста прочитал». <br /><br />И я вот подумал, что меня есть еще несколько проектов:<br />- ищу авторов книг, <br />- пишу книгу про тестирование,<br />- тестирую скилл про доступность,<br />- пишу прилу для симулятора которая будет показывать описание для скринридера,<br />- хотел бы сделать текстовую снепшот-стратегию описания для скринридера. <br /><br />И у вас, наверное, что-то есть. Расскажите в комментах про свои и почитайте чужие, вдруг найдете пересечение. Зря мы тут собрались все вместе что ли?", "date_published": "2026-07-25T11:15:06+00:00"}, {"id": "https://t.me/c/1240749873/1194", "url": "https://t.me/c/1240749873/1194", "title": "Пандус для Фигмы  Сделал плагин который позволяет легко описать разметку для VoiceOver в Фигме. О та", "content_html": "<strong>Пандус для Фигмы</strong><br /><br />Сделал плагин который позволяет легко описать разметку для VoiceOver в Фигме. О таком инструменте меня спрашивали десятки компаний, так что забирайте. <br /><br /><a href=\"https://www.figma.com/community/plugin/1658465990761157788/voiceover-annotator\">https://www.figma.com/community/plugin/1658465990761157788/voiceover-annotator</a><br /><br />Главное: он задает формат описания элементов и показывает ограничения,  которые есть у скринридера. Но это цветочки: если подключить API-ключ для нейронки, то с  помощью скила можно сгенерировать все описание! А мелочи потом руками доправить.<br /><br />Главные фичи:<br />• Повторяет интерфейс приложения <a href=\"https://rubanov.dev/voice-over-designer/\">VoiceOver Designer</a>. Если пользовались, то будете как дома. <br />• Умеет подписывать как под фреймом, так и в аннотациях для Dev Mode. <br />• Можно экпортнуть в формате .vodesign и послушать превью в VoiceOver Designer<br /><br />Плагин опенсорсный, пишите баги в ишьюс <a href=\"https://github.com/AccessibilityTools/voiceover-annotator-for-figma\">https://github.com/AccessibilityTools/voiceover-annotator-for-figma</a><br /><br />С плагином и дизайном мне помог Матвей Мясоедов. Матвей, спасибо!<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1194-0.jpg\" alt=\"media\"/>", "date_published": "2026-07-22T10:43:11+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1194-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1193", "url": "https://t.me/c/1240749873/1193", "title": "Podlodka AI Engineers Club  Этот год у меня весь идет про AI: • Березка показал как работает, • нава", "content_html": "<strong>Podlodka AI Engineers Club</strong><br /><br />Этот год у меня весь идет про AI:<br />• Березка показал как работает,<br />• навайбкодил Face Replace,<br />• запустил <a href=\"Bookshelf.dev\">Bookshelf.dev</a>,<br />• вся работа идет через AI.<br /><br />«Знание» поделилось на две части:<br />• в книжках собираем то, что из LLM не вытащишь,<br />• где учиться самому AI непонятно, не тратить же на это все свободное время. <br /><br />Егор Толстой запустил клуб про AI именно чтобы решить эту проблему. Еще и не всех берут в него, заявки рассматривают! В итоге клуб хедов-техлидов, актуально всем кто внедряет AI в работе. <br /><br />Мне понравился сам формат встречи:<br />• Лекции от разработчиков рассказывают про самое горячее что есть в индустрии и с чем работают. <br />• Лекторы из разных компаний, много зарубежных,<br />• После записи еще можно разные вопросы позадавать, <br />• Прошедшие лекции доступны в записи, а со всеми сконтачиться можно в чатике. <br /><br />Из последних/запланированных лекций:<br />• Как разрабатывать сложные легаси системы с AI с человеком, который саппортит MSBuild.<br />• Круглый стол про то, как меняется найм инженеров.<br />• Haft – харнесс для системного мышления.<br />• Как построить harness, который автономно напишет мобильное приложение.<br /><br />Рекомендую <a href=\"https://podlodka.ai/\">подать заявку и попробовать</a>, там интересно<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1193-0.jpg\" alt=\"media\"/>", "date_published": "2026-07-13T14:48:29+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1193-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1192", "url": "https://t.me/c/1240749873/1192", "title": "Когда нащупал глитч на деньги, но фейбл устойчив к джейлбрейкам", "content_html": "Когда нащупал глитч на деньги, но фейбл устойчив к джейлбрейкам<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1192-0.jpg\" alt=\"media\"/>", "date_published": "2026-07-12T00:53:14+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1192-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1191", "url": "https://t.me/c/1240749873/1191", "title": "Покупайте книжку и подписывайтесь, ведь мы будем и дальше делать туториалы про шейдеры.   Какой разо", "content_html": "Покупайте книжку и подписывайтесь, ведь мы будем и дальше делать туториалы про шейдеры. <br /><br />Какой разобрать в следующий раз? Хотите AirDrop?", "date_published": "2026-07-06T09:58:05+00:00"}, {"id": "https://t.me/c/1240749873/1190", "url": "https://t.me/c/1240749873/1190", "title": "Заморозка в Riveo  Вы точно видели этот шедевр — Riveo сделали потрясаюший эффект заморозки (видео в", "content_html": "Заморозка в Riveo<br /><br />Вы точно видели этот шедевр — Riveo сделали потрясаюший <a href=\"https://x.com/marcus_eckert/status/1734245909653848098?s=20\">эффект заморозки</a> (видео в комментариях)<br /><br />Хотите узнать как он устроен? Комбинация из текстур: <br />• normal map для бликов, <br />• height map для растаивания<br />• диаграмма Вороного, чтобы сделать неравномерное замерзание от края экрана. <br /><br />А потом все обратно, чтобы растаяло под пальцем! <br /><br />Рассказываем в туториле как это устроено. <a href=\"https://bookshelf.dev/metal-tutorials/ice\">https://bookshelf.dev/metal-tutorials/ice</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1190-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1190-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-07-06T09:57:47+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1190-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1189", "url": "https://t.me/c/1240749873/1189", "title": "Intermediate – Гoлографический стикер  Бесплатный туториал этой недели.   Benjamin Pisano сделал про", "content_html": "Intermediate – Гoлографический стикер<br /><br />Бесплатный туториал этой недели. <br /><br />Benjamin Pisano сделал простую и красивую <a href=\"https://github.com/bpisano/Sticker\">библиотеку Sticker.</a><br /><br />Эффект оказался комплексным и хорошо показывает этапы работы над шейдером. Разложили по шагам и подробно рассказали про каждый этап<br /><br /><a href=\"https://bookshelf.dev/metal-tutorials/foil-sticker\">https://bookshelf.dev/metal-tutorials/foil-sticker</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1189-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1189-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-07-06T09:56:22+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1189-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1188", "url": "https://t.me/c/1240749873/1188", "title": "Easy — Waving Loading  Довольно простой эффект на смещение пикселей. Тем не менее, показываем как сд", "content_html": "<strong>Easy — Waving Loading</strong><br /><br />Довольно простой эффект на смещение пикселей. Тем не менее, показываем как сделать плавное затухание с помощью синуса и анимации SwiftUI — полезная техника для отзывчивых интерфейсов.  <br /><br /><a href=\"https://bookshelf.dev/metal-tutorials/wave-loading\">https://bookshelf.dev/metal-tutorials/wave-loading</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1188-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1188-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-07-06T09:55:47+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1188-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1187", "url": "https://t.me/c/1240749873/1187", "title": "Как и обещал — празднуем запуск дополнительными метариалами!  Бонусом книге про Metal мы решили расс", "content_html": "Как и обещал — празднуем запуск дополнительными метариалами!<br /><br />Бонусом книге про Metal мы решили рассказывать о том как устроены популярные шейдеры от простых к сложным, поэтапно, с картинками и видео, с разными уровнями сложности. <br /><br />Туториалы доступны в подарок всем купившим книгу Apple Metal: From Fundamentals To Practice или по подписке на <a href=\"bookshelf.dev\">bookshelf.dev</a>", "date_published": "2026-07-06T09:55:33+00:00"}, {"id": "https://t.me/c/1240749873/1186", "url": "https://t.me/c/1240749873/1186", "title": "Запускаться страшно  Пару месяцев назад нам пришла идея сделать свое издательство и продавать наши к", "content_html": "<strong>Запускаться страшно</strong><br /><br />Пару месяцев назад нам пришла идея сделать свое издательство и продавать наши книги. Навайбкодить сайт и платежи несложно, но то, как проект запустится определит наше собственное ощущение. <br /><br />Сначала я запустил свою книгу по доступности на английском. <em>Всего одна покупка.</em> Да, есть на русском бесплатно, да, аудитория в канале другая, да, узкая тема. Был ли я готов? Да. Расстроился ли я? Да. <br /><br /><em>Но это была первая продажа.</em> Я написал письмо и поблагодарил, потому что для меня это было очень важно — мы запустились!<br /><br />В этот понедельник я выложил вторую книгу. Ставки выше: если и с ней ничего не пойдет, то что тогда? Страшно, очень страшно. <br /><br />Но страх не оправдался. Спасибо, что поддержали: и обычными покупками и подпиской. Поддержка дает новые силы и я заготовил сюрприз на понедельник, спойлер на видео.<br /><strong>The video is too large.</strong>", "date_published": "2026-07-03T14:41:54+00:00"}, {"id": "https://t.me/c/1240749873/1185", "url": "https://t.me/c/1240749873/1185", "title": "Курс про доступность  Я же преподаю доступность на курсе и на следующей неделе мы будем проводить ку", "content_html": "<strong>Курс про доступность</strong><br /><br />Я же преподаю доступность на курсе и на следующей неделе мы будем проводить курс 13 раз!<br /><br />Как видно по каналу, я в своем аксесибилити-прайме, готов рассказывать в лучшем виде. <br /><br />По промокоду RUBANOV скидка 15% <a href=\"https://t.co/JGO4e18Oxk\">https://accessibilityunity.com</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1185-0.jpg\" alt=\"media\"/>", "date_published": "2026-07-03T12:59:04+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1185-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1184", "url": "https://t.me/c/1240749873/1184", "title": "Покидайте шейдеры которые хотите узнать как работают: можно картинками, можно либами. Пример", "content_html": "Покидайте шейдеры которые хотите узнать как работают: можно картинками, можно либами. <a href=\"https://github.com/bpisano/Sticker\">Пример</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1184-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1184-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-07-02T13:08:36+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1184-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1181", "url": "https://t.me/c/1240749873/1181", "title": "Книги доступы по подписке  Книг будет много, книги будут разные, каждая из них — огромный опыт автор", "content_html": "<strong>Книги доступы по подписке</strong><br /><br />Книг будет много, книги будут разные, каждая из них — огромный опыт авторов, но хочется, чтобы у вас был доступ сразу ко всем знаниям, а не отдельно по книгам. <br /><br />Поэтому сразу запускаю с подпиской: за 10 долларов в месяц вы получаете доступ ко всем текущим книгам, будущим книгам и их обновлениям. Это дешевле отдельной книги в 5 раз! Сейчас уже есть две книги суммарной стоимостью в 80 долларов, т.е. дешевле в 8 раз, только успевай читать. <br /><br />До конца года начнет выходить моя новая книга про автотесты — расскажу про свой шестилетный опыт тестирования, как это работало в большой компании, как показало себя в стартапе и как это все работает с AI.<br /><br />Купить книги можно и по отдельности.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1181-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-29T11:30:14+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1181-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1180", "url": "https://t.me/c/1240749873/1180", "title": "", "content_html": "<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1180-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1179-1.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1178-2.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1177-3.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1176-4.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1175-5.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1174-6.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1173-7.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1172-8.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1171-9.jpg\" alt=\"media\"/>", "date_published": "2026-06-29T11:29:48+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1180-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1179-1.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1178-2.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1177-3.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1176-4.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1175-5.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1174-6.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1173-7.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1172-8.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1171-9.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1170", "url": "https://t.me/c/1240749873/1170", "title": "Новая книга — Apple Metal: From Fundamentals to Practice  И первую книгу написал Георгий Остробород ", "content_html": "<strong>Новая книга — Apple Metal: From Fundamentals to Practice</strong><br /><br />И первую книгу написал Георгий Остробород — про Metal! У Георгия 15 лет опыта в обработке графики и видео, работал в Procreate!<br /><br />В книге 25 глав про Metal: <br />• Разбор как связан девайс, буфер, текстура, пайплайн, команд-кью и команд энкодер.<br />• Как устроен процессинг и как получается итоговая картинка.<br />• Зачем нужны шейдеры и каких видов они бывают.<br />• Как интегрироваться в UIKit и SwiftUI.<br />• Как эффективно работать с памятью, дебажить, профилировать и добиться скорости.<br /><br />Все иллюстрировано кодом и картинками, читать одно удовольствие.<br /><br />Книга на английском, русский язык будет позже<br /><br /><a href=\"https://bookshelf.dev/metal-book\">https://bookshelf.dev/metal-book</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1170-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-29T11:29:22+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1170-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1169", "url": "https://t.me/c/1240749873/1169", "title": "Запускаю Bookshelf.dev — паблишер онлайн-книг про программирование  Пора рассказать: я не просто пер", "content_html": "<strong>Запускаю </strong><a href=\"Bookshelf.dev\"><strong>Bookshelf.dev</strong></a><strong> — паблишер онлайн-книг про программирование</strong><br /><br />Пора рассказать: я не просто переносил свою книгу на сайт, а готовил целую площадку для выпуска книг про программирование. <br /><br />Курсов как войти в IT уже навалом, а вот что делать мидл-разработчику совершенно непонятно. Я с этим столкнулся на третий год работы в Додо Пицце: нам надо срочно набрать компетенций в команде по куче тем, но нет нормальных книг про мобилу по многим темам:<br />• по доступности<br />• по автотестам<br />• по многомодульности и Tuist,<br />• по метал и т.п.<br /><br />С другой стороны, я сам написал книгу про доступность, но ее невозможно нормально издать:<br />• Тема редкая, в РФ про нее буквально слышали единицы, продаж будет очень мало, такое никто не возьмет.<br />• Я хочу максимально крутую книгу с примерами, интерактивностью, актуальностью. Бумажную книга должна быть дешевой: черно-белая, на серой бумаге. Как одновременно показать код на UIKit и SwiftUI вообще непонятно. <br />• Чтобы издать книгу нужна готовая рукопись, издаваться постепенно нельзя. Новым авторам от этого очень сложно.<br />• Крупные платформы про iOS-разработку пишут свои книги сами и внешних авторов не берут. <br /><br />Если мир не хочет решать мою проблему, то решу сам. <br /><br />Встречайте — <a href=\"https://bookshelf.dev/\">https://bookshelf.dev</a>. Книжная полка про программирование от разработчиков с опытом. <br /><br />Если у вас есть книга, которую вы хотите издать, то напишите мне в личные сообщения @akaDuality. Если у вас есть такой знакомый, то расскажите ему.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1169-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-29T11:28:53+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1169-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1168", "url": "https://t.me/c/1240749873/1168", "title": "Запилил нормальный лендинг для книжки, зацените  https://bookshelf.dev/a11y-book/en", "content_html": "Запилил нормальный лендинг для книжки, зацените<br /><br /><a href=\"https://bookshelf.dev/a11y-book/en\">https://bookshelf.dev/a11y-book/en</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1168-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-23T13:25:58+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1168-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1167", "url": "https://t.me/c/1240749873/1167", "title": "Самый важный твит для меня: анонс книги на английском.   Если у вас есть твиттер, то поддержите репо", "content_html": "Самый важный твит для меня: анонс книги на английском. <br /><br />Если у вас есть твиттер, то поддержите репостом, для меня это буквально <em>годы</em> труда. <br /><br /><a href=\"https://x.com/akaDuality/status/2069403581107573036?s=20\">https://x.com/akaDuality/status/2069403581107573036?s=20</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1167-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-23T12:54:40+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1167-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1166", "url": "https://t.me/c/1240749873/1166", "title": "Раздел про навигацию в книге Про доступность iOS   Добавил еще 6 статей — в этот раз про навигацию д", "content_html": "<strong>Раздел про навигацию в книге Про</strong> <strong>доступность iOS </strong><br /><br />Добавил еще 6 статей — в этот раз про навигацию для скринридера. <br /><br />Интересно наблюдать как я выдыхался в первой версии книги: когда дошел до навигации уже порой просто перечислял API и как оно работает. Ценно, но не так клево. <br /><br />В этот разу получилось сделать более цельный рассказ про то, как скринридер работает с деревом доступности:<br />• Как скрывать, менять, фокусировать и переставлять элементы в этом дереве<br />• Как добавить структуру на уровне заголовков и контейнеров. По пути даже сам узнал, что есть альтернативный вид навигации которым никто не пользуется. <br />• Что нужно поддержать при навигации между экранами и чем особенны модальные окна.<br />• Как работает таббар, навконтроллер и сплит-контроллер: пригодится, если вы решили создать свой аналог.<br />• Как дерево доступности синхронизируется с визуальным интерфейсом через оповещения. <br />• Огромный раздел про скролл: не столько вам надо было про это прочитать, сколько мне рассказать! Там просто золото в духе «как мне сделать ротор по заголовкам в динамическом списке» или «почему в стандартных таблицах описание само формируется». Надо трем людям на планете, не больше. <br /><br />Версия на английском тоже обновилась. <br /><br />• <a href=\"https://bookshelf.dev/a11y-book/\">Читать на русском</a><br />• <a href=\"https://bookshelf.dev/a11y-book/en/\">Купить на английском</a><br />• <a href=\"https://pay.cloudtips.ru/p/85c73978\">Поддержать проект</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1166-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-22T16:00:34+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1166-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1164", "url": "https://t.me/c/1240749873/1164", "title": "", "content_html": "<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1164-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1164-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-06-19T12:26:41+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1164-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1163", "url": "https://t.me/c/1240749873/1163", "title": "Заморочился и новые иллюстрации стал делать в светлой и темной теме  Английская версия теперь одинак", "content_html": "Заморочился и новые иллюстрации стал делать в светлой и темной теме<br /><br />Английская версия теперь одинаковая с русской версией, заходите почитать <a href=\"bookshelf.dev/a11y-book/en\">bookshelf.dev/a11y-book/en</a>", "date_published": "2026-06-19T12:26:28+00:00"}, {"id": "https://t.me/c/1240749873/1162", "url": "https://t.me/c/1240749873/1162", "title": "Книга About Accessibility in iOS  Свершилось! Я начал переводить книгу на английский. Процесс непрос", "content_html": "<strong>Книга About Accessibility in iOS</strong><br /><br />Свершилось! Я начал переводить книгу на английский. Процесс непростой и сложнее всего с картинками: надо восстановить все исходники, перевести, а лучше вообще обновить. <br /><br />Уже доступен первый раздел про доступность в целом, статистику и как пользоваться скринридером. За ближайшую неделю догоню русскую версию и дальше главы будут одновременно выходить. <br /><br /><strong>На английском книга будет платной:</strong> если в России надо было просто рассказать про тему, то для многих иностранных компаний это уже сформированная потребность. <br /><br /><strong>Только сегодня книга стоит $10,</strong> празднуем запуск и тестируем как все работает. Завтра станет $30, а когда допишу до конца — $50. Принимаются зарубежные карты.<br /><br />Это лишь начало большого плана, у меня для вас много <em>очень неожиданных</em> анонсов заготовлено и не только про доступность.<br /><br /><a href=\"https://bookshelf.dev/a11y-book/en\">https://bookshelf.dev/a11y-book/en</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1162-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-16T12:29:14+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1162-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1161", "url": "https://t.me/c/1240749873/1161", "title": "Тизер", "content_html": "Тизер<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1161-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-13T16:05:39+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1161-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1160", "url": "https://t.me/c/1240749873/1160", "title": "Как я смотрю WWDC  Посмотреть все ролики невозможно, но будто очень надо. Я прокликал видосы которые", "content_html": "<strong>Как я смотрю WWDC</strong><br /><br />Посмотреть все ролики невозможно, но будто очень надо. Я прокликал видосы которые было бы интересно посмотреть и вышло 30 штук, это невозможно посмотреть полностью. <br /><br />Но смотреть полностью и не нужно! Достаточно ознакомиться с изменениями, чтобы примерно представлять что где происходит или как может пригодиться. Поэтому на каждый видос у меня максимум минуты две:<br />• Включаю на двойной скорости на ютубе.<br />• Смотрю картинки и код, чела на фоне почти не слушаю. <br />• Что-то скришочу, когда пример хороший. <br />• Если непонятно — пофиг, у меня еще пара десятков видео впереди + они повторяют темы.  <br /><br />В итоге получается быстро много чего узнать. Когда-нибудь я вспомню что были нужные фичи в SwiftUI/AppKit/RealityKit/Accessibility/AppIntent, этого достаточно, зато кругозор и насмотренность есть.", "date_published": "2026-06-11T14:46:36+00:00"}, {"id": "https://t.me/c/1240749873/1159", "url": "https://t.me/c/1240749873/1159", "title": "Остался список задачек: • Покрутить дизайн. Все еще не нравится как выглядит. Например, сделать не о", "content_html": "Остался список задачек:<br />• Покрутить дизайн. Все еще не нравится как выглядит. Например, сделать не отдельные скрины, а на фоне узорчиком в цельную историю собрать, текст красивый сделать.<br />• Записать видео с интерфейсом, оно будет первое и самое важное. У всех остальных программ в категории видео есть.<br />• Сделать график про перформанс на мобиле. Так и про мак-прилу можно будет рассказать и ожидания сформировать более правильные. <br />• Хочу скрин про замену лиц в музыкальных клипах. У меня нет скачивания с ютуба, но направление нравится. <br />• Попробовать для разных стран подставить «местные» лица, чтобы персонализация выше была. Перевод приложения готов, осталось описание локализовать и скрины.<br />• Обновить иконку у прилы: у девушки анатомия неправильная + на онбординге можно будет выбирать между мужчиной-женщиной, все равно надо чем-то пользователя занимать пока он качает гигобайт и перед тем как я денег попрошу.", "date_published": "2026-06-10T15:51:09+00:00"}, {"id": "https://t.me/c/1240749873/1158", "url": "https://t.me/c/1240749873/1158", "title": "Вернулся к изначальным мыслям, увеличил фотки, добавил скрины настоящего приложения… и снова забил! ", "content_html": "Вернулся к изначальным мыслям, увеличил фотки, добавил скрины настоящего приложения… и снова забил! Потому что у меня прила заблокирована, ну какой смысл стараться, если это не поможет :D При этом половину субботы все равно в фигме прошла.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1158-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T15:50:39+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1158-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1157", "url": "https://t.me/c/1240749873/1157", "title": "В итоге дождался: прилу заблокировали. На самом деле не из-за скринов, а скорее описание не понравил", "content_html": "В итоге дождался: прилу заблокировали. На самом деле не из-за скринов, а скорее описание не понравилось, но при такой блокировке надо показывать сильный ребрендинг, так что пора. <br /><br />С лицами надо решить две проблемы:<br />• <strong>Кого заменять.</strong> Бесплатные фотографии брал на <a href=\"https://unsplash.com/\">https://unsplash.com</a><br />• <strong>На кого.</strong> Тут я догадался, что у меня же на иконке человек есть, поэтому я могу дожать его до персонажа, сделать и мужчину и женщину, в итоге получится хоть какой-то брендинг. Примеряю:<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1157-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T15:50:26+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1157-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1156", "url": "https://t.me/c/1240749873/1156", "title": "Конечно, не бывает ничего более постоянного, чем временное, поэтому после релиза я забил на скрины. ", "content_html": "Конечно, не бывает ничего более постоянного, чем временное, поэтому после релиза я забил на скрины. Я знал, что надо к ним вернуться: аналитика показывала, что скрины слабо приводят к скачиваниям и это первое, что надо починить. Но я что, первый раз продаю что ли, я дальше сижу фичи пилю! На самом деле первым делом пошел онбординг улучшать и там вроде неплохо вышло.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1156-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T15:49:59+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1156-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1155", "url": "https://t.me/c/1240749873/1155", "title": "Для первой версии запарился минимально: опять же взял фотку из инсты, но уже от нейрогенерации, пойд", "content_html": "Для первой версии запарился минимально: опять же взял фотку из инсты, но уже от нейрогенерации, пойди предъяви мне за нее. Обычно в этот момент я вспоминаю про то, что у меня вообще есть поддержа айпада, поэтому минимально пофиксил на нем верстку, еле-еле сделал один скрин с симулятора. Для мака чуть получше: взял клип и надеялся, что Эда Широна и трубочистов никто не узнает.<br /><br />При этом все скрины это по-сути заглушка: я знаю, что мне надо как можно быстрее <a href=\"https://t.me/RubanovMobile/1078\">пройти ревью</a> в целом, нет смысла скриншоты вылизывать.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1155-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T15:49:47+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1155-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1154", "url": "https://t.me/c/1240749873/1154", "title": "Скриншоты для App Store  Сейчас легко написать проект, сложнее опубликовать. Больше всего обламывает", "content_html": "<strong>Скриншоты для App Store<br /></strong><br />Сейчас легко написать проект, сложнее опубликовать. Больше всего обламывает делать скриншоты. Я был уверен, что для Face Replace их сделаю быстро, ведь сама приложенька генерирует контент, но не все так просто. Расскажу про процесс. <br /><br />Сначала я написал что мне надо рассказать на скринах, взял первые попавшиеся аккаунты из инсты и примерил фотку жены. Ничего непонятно + надо просить разрешения на использование чужих лиц, слишком сложно.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1154-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T15:49:32+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1154-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1153", "url": "https://t.me/c/1240749873/1153", "title": "Ачивка: разблокирую приложение быстрее Минцифры", "content_html": "Ачивка: разблокирую приложение <a href=\"https://t.me/RubanovMobile/1147\">быстрее Минцифры</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1153-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-10T12:39:44+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1153-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1152", "url": "https://t.me/c/1240749873/1152", "title": "Вертикальные свайпы — Про доступность iOS  Добавил главы про вертикальные свайпы в скринридере.   Го", "content_html": "<strong>Вертикальные свайпы — Про доступность iOS</strong><br /><br />Добавил главы про вертикальные свайпы в скринридере. <br /><br />Горизонтальными свайпами мы переключаем фокус между элементами, а вертикальными можем сделать что-то с самим элементом:<br />Поменять значение в слайдере.<br />Выбрать действие с ячейкой по двойному тапу. Например, в почте можно не открывать письмо, а отметить прочитанным или удалить. <br />Прочитать дополнительное описание. Например, ячейки в истории заказов обычно содержат слишком много информации.<br /><br />Для одного элемента можно добавить все сразу, тогда понадобится еще и ротор, чтобы выбрать нужное действие. <br /><br />В конце подытоживаем весь опыт и пишем нормальную обертку для каруселей: горизонтальных списков из баннеров. <br /><br />На текущий момент в книжке разобрано все что касается отдельных элементов, в следующий раз будет про навигацию на странице и между ними. <br /><br /><a href=\"https://bookshelf.dev/a11y-book\">Читать</a><br /><br />Проект можно <a href=\"https://pay.cloudtips.ru/p/85c73978\">поддержать</a>, тогда вы попадете на страницы книжки :-) <a href=\"https://bookshelf.dev/a11y-book/documentation/accessibilitybook/05-acknowledgements\">Первые донаты уже опубликованы</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1152-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-08T14:53:46+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1152-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1151", "url": "https://t.me/c/1240749873/1151", "title": "В сумме:  • Кеши от скила: 94 → 24 сек (-75%) • Тайп-чеки: 6 → 0.2 сек  • Прогон тестов: 115 → 42 се", "content_html": "В сумме: <br />• Кеши от скила: 94 → 24 сек (-75%)<br />• Тайп-чеки: 6 → 0.2 сек <br />• Прогон тестов: 115 → 42 сек (-63%)<br />• Тесты стали стабильнее пока скорость увеличивали 😄<br /><br />Фидбек быстрее, CI дешевле, красота. Люблю уборку по пятницам!", "date_published": "2026-06-05T18:06:49+00:00"}, {"id": "https://t.me/c/1240749873/1150", "url": "https://t.me/c/1240749873/1150", "title": "Ускорение тест-сьюта  Разработка состоит не только из билда: важно уметь и тесты быстро гонять.   Са", "content_html": "<strong>Ускорение тест-сьюта</strong><br /><br />Разработка состоит не только из билда: важно уметь и тесты быстро гонять. <br /><br /><em>Самое лучшее</em> что можно сделать это распилить прилу на модули, чтобы каждый модуль можно было со своими тестами запускать. Общему прогону не поможет, но разрабатывать через тесты станет комфортнее. LLM всегда выбирает минимальный размер запускаемого кода, поэтому тоже быстрее отвечать будет. <br /><br />Общий прогон тоже можно ускорить через LLM: запустит прогон, посмотрит на самые медленные тесты, найдет причину и починит. <br /><br />Что у меня нашла:<br />• тесты с продакшен-таймаутами, заменила 1-2 секунды ожидания на ретрай на 0.01, стало быстрее в отдельных тестах.<br />• увидела, что большой оверхед от повторной компиляции кода при запуске отдельных модулей тестов. Созадала тест-план, добавила все таргеты, отчиталась какая молодец, а потом я сказал, что у меня это уже было. Ревертнула. <br />• какие-то первые тесты в которых зависимости еще не умел нормально отделять сделала параллельными. <br />• попробовала запускать не на одном симуляторе, а на четырех. Ускорилось, записала в тест-план. При этом повышенная параллельность тестов родила флаки, починил по пути<br /><br /><blockquote>Итог: прогон тестов ускорился на 63%</blockquote><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1150-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-05T18:06:42+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1150-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1149", "url": "https://t.me/c/1240749873/1149", "title": "Ускорение тайп-чеков  Одно время были популярны статьи, что можно добавить флаги про скорость компил", "content_html": "<strong>Ускорение тайп-чеков</strong><br /><br />Одно время были популярны статьи, что можно добавить флаги про скорость компиляции, починить медленные места и получить ускорение. <br /><code>-warn-long-expression-type-checking=300 <br />-warn-long-function-bodies=300</code><br /><br />Метод ужасен по своей природе: собираешь спички, потратил 3 часа, получил 2 секунды ускорения. Дааа, в масштабе года и всей команды ты десяток часов ожидания сэкономил… но всем все равно, существенной разницы то нет. <br /><br />С LLM этот способ получил вторую жизнь: нейросетка соберет проект, вытащит данные, предложит другой код, замерит производительность, повторит это много раз. В 30 раз ускорила! С 6 секунд по сумме нескольких мест до 0.2, что тоже незаметно на инкрементальном билде всего проекта.<br /><br />С другой стороны, способ дешевый, а на большом проекте можно найти много мест и насобирать минуты, ведь весь код на кложах может стать очень медленным, а это и SwiftUI и тесты на Quick и т.п. <br /><br />Если кто-то в скил оформит, то может звездочек насобирать.<br /><br /><blockquote>Ускорение тайп-чеков: 6 сек → 0.2 сек</blockquote>", "date_published": "2026-06-05T18:05:04+00:00"}, {"id": "https://t.me/c/1240749873/1148", "url": "https://t.me/c/1240749873/1148", "title": "https://github.com/AvdLee/Xcode-Build-Optimization-Agent-Skill  Норм, 75% ускорение на клин-билд", "content_html": "<a href=\"https://github.com/AvdLee/Xcode-Build-Optimization-Agent-Skill\">https://github.com/AvdLee/Xcode-Build-Optimization-Agent-Skill</a><br /><br />Норм, 75% ускорение на клин-билд<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1148-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-05T12:14:01+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1148-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1147", "url": "https://t.me/c/1240749873/1147", "title": "Не только Макс вчера заблочили :D", "content_html": "Не только Макс вчера заблочили :D<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1147-0.jpg\" alt=\"media\"/>", "date_published": "2026-06-04T13:04:11+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1147-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1146", "url": "https://t.me/c/1240749873/1146", "title": "Скачать https://apps.apple.com/ar/app/face-replace-no-limits/id6759573300", "content_html": "Скачать <a href=\"https://apps.apple.com/ar/app/face-replace-no-limits/id6759573300\">https://apps.apple.com/ar/app/face-replace-no-limits/id6759573300</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1146-0.jpg\" alt=\"media\"/>", "date_published": "2026-05-29T13:47:37+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1146-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1145", "url": "https://t.me/c/1240749873/1145", "title": "Приложение на мак почти никто не использует, поэтому и покупки в основном для коротких видео из соцс", "content_html": "Приложение на мак почти никто не использует, поэтому и покупки в основном для коротких видео из соцсетей. Фул-анлок за $300 никто не брал, но и не должен был! Его задача лишь сделать ощущение остальных цен не такими большими.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1145-0.jpg\" alt=\"media\"/>", "date_published": "2026-05-29T13:46:45+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1145-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1144", "url": "https://t.me/c/1240749873/1144", "title": "Штаты покупают больше всех и в штуках и по сумме, ничего необычного.", "content_html": "Штаты покупают больше всех и в штуках и по сумме, ничего необычного.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1144-0.jpg\" alt=\"media\"/>", "date_published": "2026-05-29T13:46:38+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1144-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1143", "url": "https://t.me/c/1240749873/1143", "title": "По аналитике все нормально: люди пользуются, покупают, даже конверсия в покупку растет спустя месяц.", "content_html": "По аналитике все нормально: люди пользуются, покупают, даже конверсия в покупку растет спустя месяц. По бенчамркам это хорошие цифры относительно других приложений, можно скейлить. Для начала надо улучшить скриншоты, описание и качнуть поиском в сторе, все как обычно.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1143-0.png\" alt=\"media\"/>", "date_published": "2026-05-29T13:46:26+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1143-0.png", "mime_type": "image/png"}]}, {"id": "https://t.me/c/1240749873/1142", "url": "https://t.me/c/1240749873/1142", "title": "Face Replace зарабатывает  Спустя пару месяцев заработал 600 баксов, время подводить итоги. Особо ни", "content_html": "<strong>Face Replace зарабатывает</strong><br /><br />Спустя пару месяцев заработал 600 баксов, время подводить итоги. Особо ничего не делал: писал в этом канала, да в тикток видео делал, ни на одном нет больше 200 просмотров :D Статьи, твиттер и всякое другое просто некогда было, хоть и хотелось.<br /><br />Два больших всплеска: я закрыл тестфлайт на 800 человек (не знаю откуда они там набрались) и второй всплеск это просто пара крупных покупок<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1142-0.jpg\" alt=\"media\"/>", "date_published": "2026-05-29T13:46:17+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1142-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1141", "url": "https://t.me/c/1240749873/1141", "title": "Книга и AI  Долго не мог придумать чем мне AI может помочь в книге, все было как-то не так. Где бесп", "content_html": "<strong>Книга и AI</strong><br /><br />Долго не мог придумать чем мне AI может помочь в книге, все было как-то не так. Где бесполезен:<br />• Пдф переделать в DocC не смог. По ощущениям не хватило внимательности: он напутал всякое, иллюстрации неправильные поставил и т.п. хотя и Opus 4.7 был.<br />• В целом книгу писать через ИИ зашквар какой-то. Но книга то уже есть, поэтому не проблема. <br /><br />Где пригодилось:<br />• Проверить грамматику. Раньше 3 человека вычитывали опечатки, сейчас ИИ смотрит. <br />• Можно заревьювить что пропустил в главе: что непонятно, чего не хватает, что лишнее, предложить другую структуру и т.п.<br />• Написать аналогичный пример кода на SwiftUI вместо UIKit. Топовый вин, мне это было прям лень, слишком рутинно, а в итоге получилось красиво сделать через табы. DocC снова попал в точку.<br />• Перевод скорее всего можно будет сделать достаточно хорошо, останется завалидировать только.<br /><br />В итоге получается эдакий напарник в редактуре, который еще и в теме шарит. Такое подходит. <br /><br /><a href=\"https://bookshelf.dev/a11y-book\">Читать</a> · <a href=\"https://pay.cloudtips.ru/p/85c73978\">Поддержать</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1141-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1141-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-05-12T15:44:55+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1141-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1140", "url": "https://t.me/c/1240749873/1140", "title": "Продам MacBook M1 Pro в Алмате  В использовании 3 года как основной рабочий компьютер. Внешнее состо", "content_html": "<strong>Продам MacBook M1 Pro в Алмате</strong><br /><br />В использовании 3 года как основной рабочий компьютер. Внешнее состояние идеальное, работал только дома. Емкость аккумулятора 84%.<br /><br />500.000 ₸/ или обмен на айпад. Только на этой неделе, потом уеду<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1140-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1139-1.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1138-2.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1137-3.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1136-4.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1135-5.jpg\" alt=\"media\"/>", "date_published": "2026-05-11T08:02:39+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1140-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1139-1.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1138-2.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1137-3.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1136-4.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1135-5.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1134", "url": "https://t.me/c/1240749873/1134", "title": "Поддержать выпуск книжки  Изначальный план был просто через LLM прогнать всю книжку и выложить как е", "content_html": "<strong>Поддержать выпуск книжки</strong><br /><br />Изначальный план был просто через LLM прогнать всю книжку и выложить как есть, но оно переписало половину текста и потеряло половину картинок, так что приходится делать все руками как и 5 лет назад. По пути дополняю разными новыми примерами, пересобираю структуру и т.п. Кароч много работы. При этом хочется перевести на английский, а вообще я другую книгу хотел выпустить… но это еще больше работы.<br /><br />Если вам нравится <em>такая движуха</em>, то теперь можно поддержать проект — все деньги уйдут на дальнейшую работу над книжками, там прям есть на что потратиться.  <br /><br />Всех донатеров могу собрать в конце книжки, пишите в комментах к платежу как вас подписать. Будет вечный респект!<br /><br /><a href=\"https://pay.cloudtips.ru/p/85c73978\">Поддержать проект</a>", "date_published": "2026-05-04T05:10:15+00:00"}, {"id": "https://t.me/c/1240749873/1133", "url": "https://t.me/c/1240749873/1133", "title": "Новый раздел в книге «Про доступность iOS» — подписи  Время начать адаптировать приложение, выкладыв", "content_html": "<strong>Новый раздел в книге «Про доступность iOS» — подписи</strong><br /><br />Время начать адаптировать приложение, выкладываю сразу 5 статей:<br />• Подписи<br />• Кнопки<br />• Изображения <br />• Сгруппированные контролы<br />• Ячейки в списках<br /><br />Каждому разделу отдельная страничка, чтобы можно было во время работы кидать ссылку на конкретный раздел. К слову, на любой заголовок тоже можно дать ссылку, там кнопочка при наведении появляется. Люблю DocC! <del>На самом деле надежда на хорошую индексацию в поисковиках</del><br /><br />Если вы подумывали изучить доступность, то прямо сейчас самое время: каждый раздел читается минут за 30, можно читать в момент когда главы выходят. А то потом опять накопите непрочитанного и вообще не начнете! 😄<br /><br /><a href=\"https://bookshelf.dev/a11y-book\">https://bookshelf.dev/a11y-book</a>", "date_published": "2026-05-04T05:09:46+00:00"}, {"id": "https://t.me/c/1240749873/1132", "url": "https://t.me/c/1240749873/1132", "title": "Главный секрет как писать статьи  Я написал больше 30 статей, выпустил книгу, переписываю ее и готов", "content_html": "<strong>Главный секрет как писать статьи</strong><br /><br />Я написал больше 30 статей, выпустил книгу, переписываю ее и готовлю новую, но на всем протяжении мне помогает одно правило: <br /><br /><blockquote>Сначала сделай хорошие картинки, затем пиши текст</blockquote><br /><br />Если делать наоборот и писать сначала текст, то будет ощущение, что вы уже сделали 80% работы и осталось «всего то картинок накидать», но на самом деле вы только начали свою работу. Если этого не понимать, то будет очень больно. <br /><br />Почему? Качество статьи для меня определяется примерами. Текст никто не читает, в интернете все быстро все листают и живут дальше. Если смогли удержать внимание, то может быть и почитают.<br /><br />Несколько следствий<br />• Коллекционируй картинки в процессе чего-либо. Потом в телеге про каждую расскажите.<br />• Сначала я делаю презентацию по теме только из картинок, а затем пишу статью.<br />• Не обязательно должна быть картинка: схема, таблица или пример кода тоже подходят. Т.е. речь скорее об иллюстрациях к тексту.<br /><br />Готовить картинки сложно. Вот прямо сейчас я сгенерил сайт для FaceReplace, но мне надо сделать хорошие скрины и видео для примеров + в сторах скрины обновить, а я просто на стенку лезу. Хотя по ощущениями сайт то готов почти, он даже в интернете уже ищется!<br /><br /><em>Этот пост должен был выйти 5 лет назад, но я так и не нашел картинку для него!</em>", "date_published": "2026-05-03T10:06:07+00:00"}, {"id": "https://t.me/c/1240749873/1131", "url": "https://t.me/c/1240749873/1131", "title": "У меня есть один грандиозный план, но пока просто опрос", "content_html": "У меня есть один грандиозный план, но пока просто опрос", "date_published": "2026-04-27T09:10:05+00:00"}, {"id": "https://t.me/c/1240749873/1130", "url": "https://t.me/c/1240749873/1130", "title": "", "content_html": "", "date_published": "2026-04-27T09:09:50+00:00"}, {"id": "https://t.me/c/1240749873/1128", "url": "https://t.me/c/1240749873/1128", "title": "Переиздание книги про доступность  Пришло время перезапустить книгу в виде сайта!    Запускаю ее в ф", "content_html": "<strong>Переиздание книги про доступность</strong><br /><br />Пришло время перезапустить книгу в виде сайта!  <br /><br />Запускаю ее в формате DocC: <br />• доступна в онлайне, можно ссылаться на любой раздел, <br />• верстка под мобилу и декстоп, <br />• светлая/темная тема. <br /><br />Как и раньше книжка остается бесплатной. <br /><br />Как и раньше выпускать буду главами раз в пару недель, про обновления будет в этом канале. Сейчас доступна первая глава про общее понимание доступности, статистику и как пользоваться скринридером. <br /><br />Самое ценное что вы можете сделать: поделиться сайтом со своими знакомыми программистами, дизайнерами, продактами и рассказать в соцсетях. <br /><br /><a href=\"https://bookshelf.dev/a11y-book/\">https://bookshelf.dev/a11y-book/</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1128-0.jpg\" alt=\"media\"/>", "date_published": "2026-04-27T08:43:57+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1128-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1127", "url": "https://t.me/c/1240749873/1127", "title": "Всем 18 братюням и сестрюням лучи благодарности :D", "content_html": "Всем 18 братюням и сестрюням лучи благодарности :D<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1127-0.jpg\" alt=\"media\"/>", "date_published": "2026-04-22T11:06:05+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1127-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1126", "url": "https://t.me/c/1240749873/1126", "title": "Результаты опроса  Внутри: • кто какие инструменты использует,  • какой адопшен AI,  • как живет кро", "content_html": "<strong>Результаты опроса</strong><br /><br />Внутри:<br />• кто какие инструменты использует, <br />• какой адопшен AI, <br />• как живет кросс-платформа, <br />• какое ожидание от рынка, <br />• какая зарплата и т.п. <br /><br />Кайф, спасибо DevCrowd и Яндексу<br /><br /><a href=\"https://devcrowd.ru/mobile-2026\">https://devcrowd.ru/mobile-2026</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1126-0.jpg\" alt=\"media\"/>", "date_published": "2026-04-20T12:40:52+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1126-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1125", "url": "https://t.me/c/1240749873/1125", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:31+00:00"}, {"id": "https://t.me/c/1240749873/1124", "url": "https://t.me/c/1240749873/1124", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:31+00:00"}, {"id": "https://t.me/c/1240749873/1123", "url": "https://t.me/c/1240749873/1123", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:31+00:00"}, {"id": "https://t.me/c/1240749873/1122", "url": "https://t.me/c/1240749873/1122", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:31+00:00"}, {"id": "https://t.me/c/1240749873/1121", "url": "https://t.me/c/1240749873/1121", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:30+00:00"}, {"id": "https://t.me/c/1240749873/1120", "url": "https://t.me/c/1240749873/1120", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:30+00:00"}, {"id": "https://t.me/c/1240749873/1119", "url": "https://t.me/c/1240749873/1119", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:30+00:00"}, {"id": "https://t.me/c/1240749873/1118", "url": "https://t.me/c/1240749873/1118", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:30+00:00"}, {"id": "https://t.me/c/1240749873/1117", "url": "https://t.me/c/1240749873/1117", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:30+00:00"}, {"id": "https://t.me/c/1240749873/1116", "url": "https://t.me/c/1240749873/1116", "title": "Обзор на Naya Create в кружочках  Уже три месяца пользуюсь клавиатурой и пора делать выводы.   Кратк", "content_html": "<strong>Обзор на Naya Create в кружочках</strong><br /><br />Уже три месяца пользуюсь клавиатурой и пора делать выводы. <br /><br />Кратко: идея клевая, реализация сырая до сих пор<br /><strong>The video is too large.</strong>", "date_published": "2026-04-14T07:25:29+00:00"}, {"id": "https://t.me/c/1240749873/1115", "url": "https://t.me/c/1240749873/1115", "title": "Не про мобилу, но про Аргентину  Сережа работает в Додо и живет в Аргентине, а еще завел ютуб-канал ", "content_html": "<strong>Не про мобилу, но про Аргентину</strong><br /><br />Сережа работает в Додо и живет в Аргентине, а еще завел ютуб-канал и начал рассказывать про жизнь там. <br /><br />Заходите посмотреть и поддержать начинающего автора<br /><br /><a href=\"https://www.youtube.com/watch?v=_j3H4V0ypZo\"><u>https://www.youtube.com/watch?v=_j3H4V0ypZo</u></a><br /><br />А про Android Сережа пишет в канале <a href=\"https://t.me/orlovsdev\">https://t.me/orlovsdev</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1115-0.jpg\" alt=\"media\"/>", "date_published": "2026-04-09T14:31:11+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1115-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1114", "url": "https://t.me/c/1240749873/1114", "title": "М5 Про  Так совпало, что Apple выкатила новые макбуке и мне понадобился перформанс на нейроядрах, по", "content_html": "<strong>М5 Про</strong><br /><br />Так совпало, что Apple выкатила новые макбуке и мне понадобился перформанс на нейроядрах, потому что я устал ждать по три часа чтобы узнать, что видео снова почему-то не сохранилось. Дешеветь тоже ничего не собирается, потому обновился с М1 Pro на жирный М5 Pro. <br /><br />Не скажу что заметил прям сильной разницы, скорее реже стал упираться в пределы компа, но долгие процессы на 30-50% быстрее проходят.<br /><br />Хз куда мне столько памяти, но даже так я уже видел окно что память кончилась! (ладно, ладно, это у меня в проге память утекла)<br /><br />Интересным оказалось то, что Face Replace пришлось оптимизировать в новых местах! Раньше я готовил кадр, затем менял лицо и в конце его апскейлил. 2 и 3 шаг происходят на видяхе и были самыми медленными, а после переезда на М5 самым медленным оказался первый этап подготовки кадра. В итоге потюнил, стало быстрее везде работать<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1114-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1113-1.jpg\" alt=\"media\"/>", "date_published": "2026-04-07T06:30:00+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1114-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1113-1.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1112", "url": "https://t.me/c/1240749873/1112", "title": "Время понтов  Чисто по геолокации мне можно немного попонтоваться, так что делюсь актуальным сетапом", "content_html": "<strong>Время понтов</strong><br /><br />Чисто по геолокации мне можно немного попонтоваться, так что делюсь актуальным сетапом. В Аргентине вся техника стоит раза в 2-3 дороже чем в остальном мире, поэтому компенсирую три года воздержания на обновки.<br /><br />Конкурс самых странных игровых сетапов в этом канале проводят? Закидывайте свои фоточки в комменты<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1112-0.jpg\" alt=\"media\"/>", "date_published": "2026-04-07T06:21:07+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1112-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1111", "url": "https://t.me/c/1240749873/1111", "title": "Я получил аргентинское гражданство  А в какой день еще об этом рассказать.   Последние три года я пр", "content_html": "<strong>Я получил аргентинское гражданство</strong><br /><br />А в какой день еще об этом рассказать. <br /><br />Последние три года я прожил в Буэнос-Айресе. За это время получил гражданство, потому что у нас с женой там дочка родилась. За это время законы поменялись и чтобы начать дело о гражданстве надо сначала прожить два года, поэтому большинство теперь будет выбирать Бразилию. <br /><br />Если хотите что-то узнать про Аргентину или роды там — пишите.<br /><strong>The video is too large.</strong>", "date_published": "2026-04-01T16:59:38+00:00"}, {"id": "https://t.me/c/1240749873/1110", "url": "https://t.me/c/1240749873/1110", "title": "Face Replace: -90% на 1 апреля  Со всем этим долгим ревью и багами на релизе я забыл просто порадова", "content_html": "<strong>Face</strong> <strong>Replace</strong>: <strong>-90% на 1 апреля</strong><br /><br />Со всем этим долгим ревью и багами на релизе я забыл просто порадовать вас. Поэтому прямо сейчас покупка Face Replace навсегда <strong>за 20 баксов</strong> <strong>вместо 300.</strong> Не шучу. <br /><br />Ну и 5 звездочек там бахните<br /><br /><a href=\"https://apps.apple.com/ar/app/face-replace-no-limits/id6759573300?l=en-GB\">https://apps.apple.com/ar/app/face-replace-no-limits/id6759573300</a><br /><strong>The video is too large.</strong>", "date_published": "2026-04-01T04:01:52+00:00"}, {"id": "https://t.me/c/1240749873/1109", "url": "https://t.me/c/1240749873/1109", "title": "Привально поставленный вопрос  Правильно поставленный вопрос уже содержит в себе половину решения. Н", "content_html": "<strong>Привально поставленный вопрос</strong><br /><br />Правильно поставленный вопрос уже содержит в себе половину решения. Недавно снова убедился. <br /><br />На маке Face Replace глючил: видео больше 5 минут часто не могли сохраниться. При этом на айфоне такой проблемы не было. <br /><br />В процессе видео режется на кусочки по несколько секунд, чтобы можно было восстановить сессию в любом месте. В конце все кусочки склеиваются, но я иногда получал ошибку, потому что файл не смог сгенерироваться. Причем ошибка максимально тупая в духе <code>AVFoundationErrorDomain - 11800 — An unknown error occurred (-17913) - Caused by: Error Domain=NSOSStatusErrorDomain Code=-17913 &quot;(null)&quot;.</code>  <br /><br />Я раз за разом уточнял детализацию ошибок, но мне это не помогло. В целом, ресерч показал, что кусочки видео куда-то пропадают, поэтому файл не создается. Но куда? Мой код их не удаляет, очистка будет после создания полного файла. <br /><br />Сегодня осенило вопросом: <em>а куда сохраняются</em> промежуточные кусочки видео?<br /><br />Оказалось, что в папку документов, а она синхронизируется с облаком. Генерация длинных видео занимает часы, iCloud видит новые файлы которые никто не использует, но <em>кто-то</em> активно пишет на диск, поэтому и выгружает файлы в сеть. Когда дело доходит до сохранения, то кусочки уже пропали.<br /><br />Подвинул сохранение из документов в кеш, все заработало. Уже зарелизил фикс, но жаль что голову ломал две недели.", "date_published": "2026-03-28T11:24:23+00:00"}, {"id": "https://t.me/c/1240749873/1108", "url": "https://t.me/c/1240749873/1108", "title": "", "content_html": "", "date_published": "2026-03-25T08:01:31+00:00"}, {"id": "https://t.me/c/1240749873/1107", "url": "https://t.me/c/1240749873/1107", "title": "Вайбкодинг в самолете с телефона  Я писал весь этот текст пока летел из Буэнос-Айреса в Алматы. Пере", "content_html": "<strong>Вайбкодинг в самолете с телефона</strong><br /><br />Я писал весь этот текст пока летел из Буэнос-Айреса в Алматы. Перелет из Сан Пауло в Доху занимает 15 часов: ужасно долго, хорошо что сижу у прохода. Раньше это было 15 часов мучения, а сейчас я искренне кайфую: <br />ноут лежит в портфеле,<br />на ноуте запущен терминал с клодом,<br />клод через старлинк ходит куда-то на сервер антропиков и пишет код<br />по проводу подключен айфон, сборки можно устанавливать только так,<br />на телефоне запущен клод в ремоут режиме: я отдаю команды, клод пишет, комп собирает, я на телефоне тестирую. <br /><br />Чтобы комьютер не выключался во время процессинг я прописал <code>sudo pmset -a disablesleep 1</code><br /><br />Два ужасных минуса:<br />• когда клод закончил он не присылает пуш (и это мешает мне писать этот текст, приходится вручную провкрять статус)<br />• у меня всего один провод, поэтому приходится перетыкать между телефоном и зарядкой ноута.<br />- бонус: в конце перелета начали бомбить Доху, из-за чего пришлось сесть в Каире и через Стамбул добираться. Итого 50+ часов на перелет<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1107-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T06:09:40+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1107-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1106", "url": "https://t.me/c/1240749873/1106", "title": "Не все тестируется  Увы, в ограничения я тоже уперся много раз. Например, нейро-ядра работают только", "content_html": "<strong>Не все тестируется</strong><br /><br />Увы, в ограничения я тоже уперся много раз. Например, нейро-ядра работают только если запускать тесты только на реальном телефоне. Или на других телефонах артефакты бывают. Или сохранение больших видео может ломаться с неведомой ошибкой, а чтобы второй раз проверить сохранение надо прогнать видос еще НА 3 ЧАСА. Но даже так начинаешь писать восстановление файла из обрывычного состояния, что повышает надежность приложения. <br /><br />Но с AI по большей части остается принимать решения да валидировать результат, поэтому все усилия окупаются и продолжают не ломаться.", "date_published": "2026-03-25T05:36:30+00:00"}, {"id": "https://t.me/c/1240749873/1105", "url": "https://t.me/c/1240749873/1105", "title": "Ну а где превьюшки, там и скриншот-тесты через Prefire. Это особо удобно, потому что изменения надо ", "content_html": "Ну а где превьюшки, там и скриншот-тесты через Prefire. Это особо удобно, потому что изменения надо делать на двух-трех платформах, а чтобы проверить результат надо все по очереди перезапускать и проверять. Со скриншот-тестами можно переложить это на машину. <br /><br />Кажется, фигма выкатила обновленик про тоже самое <a href=\"https://www.figma.com/blog/the-figma-canvas-is-now-open-to-agents/\">https://www.figma.com/blog/the-figma-canvas-is-now-open-to-agents/</a>", "date_published": "2026-03-25T05:36:25+00:00"}, {"id": "https://t.me/c/1240749873/1104", "url": "https://t.me/c/1240749873/1104", "title": "Превью  Дизайнить клодом прикольно: я говорил что хочу поправить, тут же смотрел результат в SwiftUI", "content_html": "<strong>Превью</strong><br /><br />Дизайнить клодом прикольно: я говорил что хочу поправить, тут же смотрел результат в SwiftUI Preview. Удобно, что все данные живые, поэтому максимально близко к продакшену выходит. Собрал все свои тупые промпты, результат до и после.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1104-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T05:36:12+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1104-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1103", "url": "https://t.me/c/1240749873/1103", "title": "Снепшоты для поиска и установки лиц  Представьте задачу для тестирования: у вас есть видео из кучи к", "content_html": "<strong>Снепшоты для поиска и установки лиц</strong><br /><br />Представьте задачу для тестирования: у вас есть видео из кучи кадров, в кадре несколько лиц, вам надо назначить одно из них на замену и убедиться, что лицо не отваливается между кадрами. Как протестируете? Подумайте секунду над задачкой. <br /><br />Я люблю тестировать через снепшоты, потому что легко сделать визуальный срез какого-то процесса. Так я попросил сделать снепшот-стратегию, которая найдет лица на небольшом видео, запишет в каких кадрах какие индексы лиц он нашел. В итоге тест из двух строк, а остальное само генерится. <br /><br />Более того, это дало возможность обсуждать с AI результаты на промежуточном языке: могу сказать, что вот в первом тесте с 16 по 22 кадр лицо на самом деле тот же человек, поправь параметры чтобы они объеденялись. И оно работало!<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1103-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T05:35:59+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1103-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1102", "url": "https://t.me/c/1240749873/1102", "title": "В итоге я описывал что я хочу в виде сценария, просил вызывать методы только у вьюмодели. Интересно,", "content_html": "В итоге я описывал что я хочу в виде сценария, просил вызывать методы только у вьюмодели. Интересно, что пример с лева очень похож на Spec Driven Development, так что присмотритесь к SDD.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1102-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T05:35:45+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1102-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1101", "url": "https://t.me/c/1240749873/1101", "title": "Интеграционные тесты поверх коротких видео  Основная часть приложение крутится вокруг одного экрана ", "content_html": "<strong>Интеграционные тесты поверх коротких видео</strong><br /><br />Основная часть приложение крутится вокруг одного экрана с пачкой разных состояний. При этом надо обрабатывать фото и видео, с одним лицом и несколькими, учитывать уровень подписки и много чего внутри еще. Если попросить AI написать тесты, то он нафигачит много юнитов, их невозможно читать. Мне нужны более интеграционные тесты. <br /><br />Проблема началась с того, что я даже вьюмодель не выносил из вью :D Пруф:<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1101-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T05:35:35+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1101-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1100", "url": "https://t.me/c/1240749873/1100", "title": "Профилировщик  Вот обрабатываю я видос: лицо надо найти, заменить, апскейлнуть, по цветам подогнать,", "content_html": "<strong>Профилировщик</strong><br /><br />Вот обрабатываю я видос: лицо надо найти, заменить, апскейлнуть, по цветам подогнать, на каждый шаг отдельная нейронка. Так для каждого кадра, а само видео делится еще на чанки из нескольких секунд, чтобы не грузить слишком много данных в оперативку. При этом мне надо, чтобы процессор работал на полную, оперативки потреблялось минимум и она не текла, не сломать SSD от количество чтений и записи. Все это нужно проверять после каждого изменения, потому что количество неправильных оптимизаций было больше нескольких десятков.<br /><br />Я попросил Claude:<br />выделить пайплайн обработки видео в отдельный пакет, все равно он из нескольких проектов используется.<br />добавить к нему CLI, <br />добавить os_signpost вокруг важных мест,<br />запустить конвертацию видео в профилировщике,<br />добавить в рулы правило, что любое изменение пайплайна должно проходить бенчмарк между старой и новой версией.<br /><br />В итоге он сам находил сломанные места, точнее делал оптимизации и вообще запускал отличные бенчмарки почти на каждое изменение в процессе обработки видео.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1100-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-25T05:35:20+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1100-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1099", "url": "https://t.me/c/1240749873/1099", "title": "Как тестировать AI-видео-редактор  Весь проект я написал за три недели полностью через AI. Большая ч", "content_html": "<strong>Как тестировать AI-видео-редактор</strong><br /><br />Весь проект я написал за три недели полностью через AI. Большая часть знаний нужна была про обработку видео, а не разработку для iOS, поэтому несколько раз я жестко ошибался. Еще много багов впереди надо починить, но они точно не из-за AI. По факту AI написал очень много достаточно хорошего кода, а баги всплывают, потому что сделано слишком много за сликшом маленькое время и многое надо просто уточнить. <br /><br />Первая неделя была отличной, на второй я добавил профилировщик, а на третьей понадобились тесты.", "date_published": "2026-03-25T05:35:05+00:00"}, {"id": "https://t.me/c/1240749873/1098", "url": "https://t.me/c/1240749873/1098", "title": "Разные  приложения  Я написал приложение для айфона и для мака. Приложение получились разными, интер", "content_html": "<strong>Разные  приложения</strong><br /><br />Я написал приложение для айфона и для мака. Приложение получились разными, интересно обсудить причины. <br /><br /><strong>На айфоне</strong> обработка медленная даже на 16 Про, при этом нельзя сворачивать приложение, нейро-ядра отключатся. Значит и видео будут генрировать только короткие: из рилсов, тиктока, ютуба. <br /><br />В таких роликах часто один человек, часто в начале нужно кропнуть видео, чтобы еще короче стало. А еще экстеншен-грузилку из инсты/твиттера/ютуба прикрутить. А еще они вертикальные и надо подстраивать интерфейс под это. <br /><br /><strong>На маке</strong> с М1 скорость выше в 3-4 раза, нет ограничений на работу приложения в фоне, поэтому можно взять и «видосик» подлиннее. Тогда шансы встретить несколько человек выше, сцены могут быть разные, иногда нужно отключать замену рта (когда его перекрывает микрофон или чашка кофе). Все это не влезало в интерфейс айфона, поэтому отключил. <br /><br />Версию для айпада еще надо сделать похожей на мак, потому что там М-процессоры и от этого на айпаде можно сворачивать приложение для процессинга в фоне.<br /><br />Технически при этом много общего: <br />• UI разный у каждой платформы, но с общими паттернами. За поавторением функционала AI следил сам. <br />• Общие контролы типо полосы превью, кропа, плеера видео с детектом лиц лежат в едином фичовом модуле. <br />• Паплайн процессинга в базовом модуле инфраструктуры. Его же можно запускать из CLI чтобы бенчмарки крутить. <br />• Загрузчики видео из разных соцсетей ваще хоть опенсорсить можно. <br /><br />Многомодульность, тесты, доступность и т.п. AI сам сделать не предложит, поэтому за инфраструктурой и инженеркой надо следить самому.", "date_published": "2026-03-24T09:05:18+00:00"}, {"id": "https://t.me/c/1240749873/1097", "url": "https://t.me/c/1240749873/1097", "title": "Face Replace для мака  Выпустил приложение и для мака: • можно взять клип/фильм, приложение затрекае", "content_html": "<strong>Face Replace для мака</strong><br /><br />Выпустил приложение и для мака:<br />• можно взять клип/фильм, приложение затрекает всех людей, а потом заменит их как надо. <br />• на таймлайне можно выбирать режим как менять лицо: полностью или только глаза. Пригодится, если персонажи много говорят, носят бороды и т.п.<br />• можно ставить несколько роликов в очередь и обрабатывать несколько суток подряд.<br /><br /><a href=\"https://apps.apple.com/us/app/face-replace-no-limits/id6759573300\">Скачать</a><br /><strong>The video is too large.</strong>", "date_published": "2026-03-24T09:02:54+00:00"}, {"id": "https://t.me/c/1240749873/1096", "url": "https://t.me/c/1240749873/1096", "title": "Я завел тикток", "content_html": "Я завел <a href=\"https://www.tiktok.com/@face.replace.no.limits\">тикток</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1096-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1096-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2026-03-23T18:12:51+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1096-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1095", "url": "https://t.me/c/1240749873/1095", "title": "Face Replace: No limits  Я написал приложение, которое меняет лица на видео.   На фотках можно менят", "content_html": "<strong>Face Replace: No limits</strong><br /><br />Я написал приложение, которое меняет лица на видео. <br /><br />На фотках можно менять бесплатно. Кто первый протестирует полный анлок — подарю сплит-клавиатуру. <br /><br />Главная фича: все расчеты на вашем устройстве. Модели займут место, телефон будет греться, это не топ-AI по рынку, но полная приватность и любая длина видео, а процессит даже на парковке. <br /><br />Пошерьте за себя и за Сашку. <br /><br /><a href=\"https://apps.apple.com/us/app/face-replace-no-limits/id6759573300\">Скачать</a><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1092-3.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1092-3.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video><br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1091-4.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1091-4.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video><br /><strong>The video is too large.</strong>", "date_published": "2026-03-18T12:24:59+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1092-3.mp4", "mime_type": "video/mp4"}, {"url": "https://tg.davvie.com/static/-1001240749873--1091-4.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1086", "url": "https://t.me/c/1240749873/1086", "title": "Проблема не только у меня", "content_html": "Проблема не только у меня<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1086-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-17T16:54:53+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1086-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1085", "url": "https://t.me/c/1240749873/1085", "title": "15 лайков и 700 пользователей в тест флайте.   Все что надо знать про соц инженерию через лайки", "content_html": "15 лайков и 700 пользователей в тест флайте. <br /><br />Все что надо знать про соц инженерию через лайки", "date_published": "2026-03-17T14:43:54+00:00"}, {"id": "https://t.me/c/1240749873/1084", "url": "https://t.me/c/1240749873/1084", "title": "Ревьювер запустил на айпаде и ему не понравилось как прила выглядит.   Оказалось, попытка сделать re", "content_html": "Ревьювер запустил на айпаде и ему не понравилось как прила выглядит. <br /><br />Оказалось, попытка сделать readable content guide полностью провалилась на экране покупок и только на нем. <br /><br />А я лучше интерфейс уже никогда не сделаю, искусство.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1084-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1083-1.jpg\" alt=\"media\"/>", "date_published": "2026-03-17T14:39:48+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1084-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1083-1.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1082", "url": "https://t.me/c/1240749873/1082", "title": "iOS in 2026 Meetup от Bereke Bank 💣  9 апреля собираем iOS-сообщество на новый митап, где обсудим, к", "content_html": "<strong>iOS in 2026 Meetup от Bereke Bank 💣</strong><br /><br /><strong>9 апреля собираем iOS-сообщество</strong> на новый митап, где обсудим, как меняется разработка iOS сегодня и что нас ждёт дальше.<br /><br /><strong>Спикеры митапа:</strong><br />▪️<em>Михаил Рубанов — iOS Lead в Jazari, ex-Head of Mobile в Dodo Engineering</em><br /><strong>Тема: «Как AI дал автотестам вторую жизнь»</strong><br />▪️<em>Артём Новичков — iOS Developer в Salmon Group Ltd</em><br /><strong>Тема: Agentic coding для iOS-разработчика</strong><br />▪️<em>Виктор Гордиенко — Senior iOS Developer в inDrive</em><br /><strong>Тема: Live Activity — как, зачем и почему<br /></strong><br />Кроме докладов, будет <strong>панельная дискуссия</strong> — и её состав будет не менее интересным. Пока оставим интригу и расскажем о ней в следующем посте.<br /><br />Митап будет модерировать <strong>Дима Бузулуцкий — Tech Lead Mobile в Bereke Bank.</strong><br /><br /><strong>Регистрируйтесь по </strong><a href=\"https://forms.gle/8zSEQwcuAQyw3BAv5\"><strong>ссылке</strong></a><strong> — </strong>вход на митап по предварительной регистрации.<strong><br /></strong><br />Будем рады увидеться!<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1082-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-17T12:43:36+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1082-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1081", "url": "https://t.me/c/1240749873/1081", "title": "Выступаю в офлайне впервые за 7 лет.    3 звезды мишлена, стоит планировать поездку под это дело", "content_html": "Выступаю в офлайне впервые за 7 лет.  <br /><br />3 звезды мишлена, стоит планировать поездку под это дело", "date_published": "2026-03-17T12:43:36+00:00"}, {"id": "https://t.me/c/1240749873/1080", "url": "https://t.me/c/1240749873/1080", "title": "Разные стадии отправки сборки на ревью", "content_html": "Разные стадии отправки сборки на ревью<br /><strong>The video is too large.</strong>", "date_published": "2026-03-13T08:33:16+00:00"}, {"id": "https://t.me/c/1240749873/1079", "url": "https://t.me/c/1240749873/1079", "title": "Ревьювер спрашивает не дорого ли брать 300 баксов за лайфтайм покупку.   - какое его дело - в целом ", "content_html": "Ревьювер спрашивает не дорого ли брать 300 баксов за лайфтайм покупку. <br /><br />- какое его дело<br />- в целом валидный вопрос относительно мабука нео за 600<br />- да я не против что с трех покупок смогу взять себе новый макбук<br /><br />В остальном это просто годовая подписка за три года", "date_published": "2026-03-13T07:50:19+00:00"}, {"id": "https://t.me/c/1240749873/1078", "url": "https://t.me/c/1240749873/1078", "title": "Я ненавижу ревью от Apple  Просто эмоциональный пост насколько я от него устал.   Я написал приложен", "content_html": "<strong>Я ненавижу ревью от Apple</strong><br /><br />Просто эмоциональный пост насколько я от него устал. <br /><br />Я написал приложение за два дня и сразу отправил в TestFlight, чтобы показать друзьям. Понадобилось два дня чтобы кто-то добрался и поставил мне там галочку «все следующие версии пропускайте автоматом». За эти два дня я успел написать еще в три раза больше кода чем было в первой версии. <br /><br />Я отправил готовую прилу на ревью вечером воскресенья, но до среды не было никакого движения. Только через экспедит ревью получилось добиться фидбека, я все поправил, а потом… снова ничего. Снова запросил экспедит, прилу взяли на ревью… и рабочий день закончился, висит на ревью десятый час. Завтра наступит пятый день ожидания. <br /><br />Кажется, что прямо сейчас стало только хуже от наплыва разных приложений. Могут они там для ревью агента какого-нибудь уже сделать?", "date_published": "2026-03-12T14:13:07+00:00"}, {"id": "https://t.me/c/1240749873/1077", "url": "https://t.me/c/1240749873/1077", "title": "Сегодня я Эплу лицом не вышел.", "content_html": "Сегодня я Эплу лицом не вышел.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1077-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-11T14:09:19+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1077-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1076", "url": "https://t.me/c/1240749873/1076", "title": "Готовлю я значит релиз...", "content_html": "Готовлю я значит релиз...", "date_published": "2026-03-11T14:09:19+00:00"}, {"id": "https://t.me/c/1240749873/1075", "url": "https://t.me/c/1240749873/1075", "title": "Я не читаю Excel  Недавно у нас прошло performance review инженеров. На выходе я получил большую таб", "content_html": "<strong>Я не читаю Excel</strong><br /><br />Недавно у нас прошло performance review инженеров.<br />На выходе я получил большую таблицу со всеми результатами мобильных команд.<br /><br />iOS, Android и Flutter инженеры в Dodo Pizza, Drinkit и других проектах.<br /><br />Сотни строк, десятки навыков и оценки по каждому пункту.<br />Я открыл Excel, посмотрел секунд десять и понял, что так я ничего не пойму.<br /><br />Я вообще плохо воспринимаю данные в таблицах.<br />Мне нужно видеть графики.<br /><br />Мне хотелось ответить на несколько простых вопросов.<br /><br /><strong>Профиль инженера</strong><br />Какие компетенции сильные, где есть пробелы. Архитектура, практики, инфраструктура. Не сумма баллов, а форма. Когда это нарисовано, уровень читается буквально за несколько секунд.<br /><br /><strong>Профиль команды</strong><br />Иногда команда сильная в UI, но слабее в архитектуре. У другой наоборот. В таблице это почти незаметно, а на графике такие перекосы видно сразу.<br /><br /><strong>Профиль платформы (iOS / Android / Flutter)</strong><br />Внутри одного продукта платформы могут отличаться довольно сильно. На визуализации разница между платформами становится очень очевидной.<br /><br />В этот момент пригодился всеми любимый вайб-кодинг.<br />Я быстро накидал запрос в Claude и получил первую визуализацию в JSX.<br /><br />Потом мои лиды попросили такие же графики по своим командам и я понял, что либо буду каждый раз генерировать новую визуализацию в Claude, либо нужно сделать один инструмент для всех.<br /><br />Так появился <a href=\"https://dodobrands.github.io/ReviewRadar/\">ReviewRadar</a>.<br />Это простая веб-страница, куда загружаете <a href=\"https://github.com/dodobrands/ReviewRadar/blob/main/example.xlsx\">Excel</a> с результатами ревью и сразу видите радары и другие визуализации.<br /><br />Она показывает профиль компетенций инженера или команды.<br />Сразу видно, где сильные стороны, где просадка. А если наложить несколько радаров - мгновенно видно разницу между командами или платформами.<br /><br />И это ожидаемо очень полезно для ИПР, когда показываешь такой график на 1-1, точки роста становятся очевидными.<br /><br />В проекте есть example таблица.<br />Можно скачать и посмотреть, как это работает.<br /><br /><a href=\"https://github.com/dodobrands/ReviewRadar\">ReviewRadar</a> - опенсорс, так что вы можете сделать форк и допилить под себя.<br /><br />Если вы тоже проводите performance review в Excel - попробуйте хотя бы раз посмотреть на него графиками.<br />Очень меняет восприятие.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1075-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1074-1.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1073-2.jpg\" alt=\"media\"/>", "date_published": "2026-03-11T08:56:04+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1075-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1074-1.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1073-2.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1072", "url": "https://t.me/c/1240749873/1072", "title": "Нейросеть работает локально на телефоне/маке, на iPhone 16 Pro рилс за 10 минут переваривает, на баз", "content_html": "Нейросеть работает локально на телефоне/маке, на iPhone 16 Pro рилс за 10 минут переваривает, на базовом 17 в 3 раза быстрее, производительность 17 про еще надо узнать. На М1 работает в 4 раза быстрее чем на 16 про, а на М4-5 вообще все отлично должно быть.", "date_published": "2026-03-05T04:43:10+00:00"}, {"id": "https://t.me/c/1240749873/1071", "url": "https://t.me/c/1240749873/1071", "title": "Навайбкодил прилу для дипфейков  На прошлой неделе решил ультимативно окунуться в вайбкодинг, а для ", "content_html": "<strong>Навайбкодил прилу для дипфейков</strong><br /><br />На прошлой неделе решил ультимативно окунуться в вайбкодинг, а для этого надо было придумать какой-то проект. Ну я и попробовал написать прилу, которая лица будет подменять на видео. Получилось! Я сам не написал ни строчки, лишь пару раз в коде подвигал верстку, потому что это было быстрее чем объяснять результат клоду. <br /><br />Нормальный анонс сделаю позже, но потестировать можно уже сейчас <a href=\"https://testflight.apple.com/join/kz1YansT\">https://testflight.apple.com/join/kz1YansT</a> Там пачка багов все еще есть, поэтому  назовем это альфа-версией. Версия для мака по той же ссылке. <br /><br />Про опыт вайбкодинга расскажу ближе к релизу, но Cloude теперь в сердечке<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1071-0.jpg\" alt=\"media\"/>", "date_published": "2026-03-05T04:40:15+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1071-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1070", "url": "https://t.me/c/1240749873/1070", "title": "Исследование мобильных разработчиков 2026  Клевый опросник и интерсный бенчмарк для рынка наконец то", "content_html": "<strong>Исследование мобильных разработчиков 2026</strong><br /><br />Клевый опросник и интерсный бенчмарк для рынка наконец то продолжился! Я сильно скучал по нему: <a href=\"https://devcrowd.ru/ios-ecosystem-22/companies/\">последний был в 2022 году</a> и Додо Инжиниринг тогда сразу ворвался в топ, как и этот канал. Тогда все только начиналась, книга выходила, доклады пеклись и очень хотелось узнать новые результаты… <br /><br />Заходите рассказать про ваш опыт, потом вместе почитаем<br /><br /><a href=\"https://survey.alchemer.eu/s3/91030492/mobile-2026\">https://survey.alchemer.eu/s3/91030492/mobile-2026</a>", "date_published": "2026-02-24T19:02:23+00:00"}, {"id": "https://t.me/c/1240749873/1069", "url": "https://t.me/c/1240749873/1069", "title": "Scout — тула и либа для анализа метрик кода  На нашей публичной страничке есть метрики кода: • Сколь", "content_html": "<strong>Scout — тула и либа для анализа метрик кода</strong><br /><br />На нашей <a href=\"https://buildin.ai/share/52528d4c-57ef-458f-aaa4-534b3a700be7\">публичной страничке</a> есть метрики кода:<br />• Сколько у нас UIView, UIViewController<br />• Сколько у нас ксиб и сторибордов<br />• Какие фреймворки для тестов мы юзаем<br /><br />И всё это за все годы жизни приложения — благодаря гиту.<br /><br />Тулу для подсчета этого добра, Скаут, мы выпускаем в опенсорс.<br /><br />Ставите, описываете конфиг че собирать надо, запускаете — она собирает.<br /><br />На самом деле она умеет:<br />• Считать типы — парсит код через SourceKitten и обходит дерево, так что учитывает все наследования, реализации протоколов и всё такое.<br />• Считать расширения — найдет все сториборды, ксибы, ассеты или что вам там надо<br />• Считать паттерны — найдет все ваши <code>swiftlint:disable</code>, <code>TODO</code>, импорты библиотек или кастомные варнинги.<br />• LoC по папкам — покажет как у вас распил проекта на модули идёт<br />• билд-сеттинсы — киллер-фича, покажет как у вас проект переезжает на Swift 6, ну или на что угодно ещё, что хранится в билд-сеттинсах.<br /><br />По дефолту метрики собираются для текущего комита, но можно передать список комитов с нужной вам гранулярностью: раз в месяц, в неделю, день или вообще хоть каждый комит. Тула автоматом по ним пробежится и соберет указанные метрики.<br /><br />Данные на выходе в джсоне, и вы с ним что хотите делаете — выгружаете в ваши внутренние системы аналитики, отправляете отчеты в чаты с метриками, выгружаете в гугло-таблицы ну или на что у вас фантазии хватит.<br /><br />Идеально подходит для интеграции на CI, но можно и локально запускать. <br />Вместе с CLI в репе лежит и SDK, так что даже сможете свой тулинг поверх этого собрать.<br /><br />Скаут поможет вам:<br />• Понять текущее состояние<br />• Понять как вы в нем оказались<br />• Выделить проблемные места, чтобы вы план по отказу от техдолга составили.<br />• Следить за движением по этому плану.<br /><br />Короч, если вы лидируете команды — это для вас.<br /><br /><a href=\"https://github.com/dodobrands/scout\">Открыть на гитхабе</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1069-0.jpg\" alt=\"media\"/>", "date_published": "2026-02-20T15:05:47+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1069-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1068", "url": "https://t.me/c/1240749873/1068", "title": "Очень рад, что Березка показал всем инструмент.   Мы с ним собирали все подряд, оцифровывали прогрес", "content_html": "Очень рад, что Березка показал всем инструмент. <br /><br />Мы с ним собирали все подряд, оцифровывали прогресс по проектам, очень удобно. Попробуйте!", "date_published": "2026-02-20T15:05:47+00:00"}, {"id": "https://t.me/c/1240749873/1067", "url": "https://t.me/c/1240749873/1067", "title": "Срочно надо всем посмотреть  https://www.youtube.com/watch?v=uqTqKIY8qII", "content_html": "Срочно надо всем посмотреть<br /><br /><a href=\"https://www.youtube.com/watch?v=uqTqKIY8qII\">https://www.youtube.com/watch?v=uqTqKIY8qII</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1067-0.jpg\" alt=\"media\"/>", "date_published": "2026-01-31T07:05:07+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1067-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1066", "url": "https://t.me/c/1240749873/1066", "title": "Я в Алмате   Записывали когда я еще был в Аргентине, а этот год планирую прожить в Алмате. Поэтому е", "content_html": "<strong>Я в Алмате </strong><br /><br />Записывали когда я еще был в Аргентине, а этот год планирую прожить в Алмате. Поэтому если хотите встретиться, позвать выступить у вас в компании про доступность или автотесты, если есть какие-то митапы где точно надо выступить — пишите!", "date_published": "2026-01-23T11:36:14+00:00"}, {"id": "https://t.me/c/1240749873/1065", "url": "https://t.me/c/1240749873/1065", "title": "Интервью про доступность, клавиатуры и Аргентину  Планируйте выходные так, чтобы нашлось время посмо", "content_html": "<strong>Интервью про доступность, клавиатуры и Аргентину</strong><br /><br />Планируйте выходные так, чтобы нашлось время посмотреть интервью про доступность! Рассказываю разное про свой прошлый опыт, демографию, правильный взгляд на доступнось, почему интерес к клавиатурам это прямое продолжение доступности, как правильное рабочее место в итоге помогло написать книгу и спойлерю планы на следующий год. Получилось задорно, рекомендую. <br /><br /><a href=\"https://www.youtube.com/watch?v=uqTqKIY8qII\">https://www.youtube.com/watch?v=uqTqKIY8qII</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1065-0.jpg\" alt=\"media\"/>", "date_published": "2026-01-23T11:35:23+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1065-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1064", "url": "https://t.me/c/1240749873/1064", "title": "Новая клавиатура!", "content_html": "Новая клавиатура!", "date_published": "2026-01-22T09:37:08+00:00"}, {"id": "https://t.me/c/1240749873/1063", "url": "https://t.me/c/1240749873/1063", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2026-01-22T09:36:14+00:00"}, {"id": "https://t.me/c/1240749873/1062", "url": "https://t.me/c/1240749873/1062", "title": "У меня сегодня день рождения. 34, юху! 🎉🎉🎉  Если у вас есть истории как мои статьи/канал/выступления", "content_html": "У меня сегодня день рождения. 34, юху! 🎉🎉🎉<br /><br />Если у вас есть истории как мои статьи/канал/выступления/книга повлияли на вас, то я бы с радостью почитал про это в комментариях", "date_published": "2026-01-21T07:46:32+00:00"}, {"id": "https://t.me/c/1240749873/1060", "url": "https://t.me/c/1240749873/1060", "title": "Point-Free  Пойнт фри, пойнт-фришечка, пойнт-пойнт, фриии. Статьи, видосы, библиотечки, мммм, любимо", "content_html": "<strong>Point-Free</strong><br /><br />Пойнт фри, пойнт-фришечка, пойнт-пойнт, фриии. Статьи, видосы, библиотечки, мммм, любимое. <br /><br />На самом деле последние пару лет на мой иосный рост и на многие архитектурные решения влияют ребята из Point-Free. Как они чувствуют язык, как описывают темы, какие инструменты дают, как с комьюнити работают, как мощно либы поддерживают. Невероятная планка, вторых таких ребят не знаю. Больше всего повлияли на подход к модуляризации и работе с зависимостями, а следом и к тому, как должны выглядеть тесты. <br /><br />При этом постоянно использую их инструменты. Прямо сейчас в проекте:<br /> ⁃ Dependencies дает контроль над зависимостями<br /> ⁃ Perception бэкпортит Observation<br /> ⁃ Sharing шерит данные между разными модулями и хранит их между сессиями <br /> ⁃ Snapshot Testing дает скриншот-тесты<br /> ⁃ CasePathable позволяет описать роутинг енумками с вьюмоделями<br /> ⁃ Swift Navigation — поверх CasePathable можно сделать навигацию для SwiftUI или UIKit. В итоге получается тестируемая навигация. <br /><br />По сути The Composable Architecture состоит из всего этого, но напрямую я его не использую. <br /><br />Если вы вдруг пропустили, то подключайтесь: часть записей бесплатны и можно понять что ждет, а часть закрыта за пейволом, но оно того прям стоит. По сути большая часть статей подробно рассказывает как либы устроены внутри и как ими пользоваться со всех сторон, но по пути еще и про свифт многое узнаете. <br /><br />Стоит больше сотки за год, но сейчас действует скидка в 25%, можно подключиться через мою рефералку <a href=\"https://www.pointfree.co/subscribe/personal?ref=VpLjSbxe\">https://www.pointfree.co/subscribe/personal?ref=VpLjSbxe</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1060-0.jpg\" alt=\"media\"/>", "date_published": "2025-12-24T07:17:06+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1060-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1059", "url": "https://t.me/c/1240749873/1059", "title": "Удивительно, но я не нашел ни одного адвент-календаря про вархаммер. А ведь можно каждый день достав", "content_html": "Удивительно, но я не нашел ни одного адвент-календаря про вархаммер. А ведь можно каждый день доставать фигурки, краски, кисточки, разные армии собирать одновременно и т.п.<br /><br />Стоить будет как имперский звездолет, как и все остальное по вахе.", "date_published": "2025-12-16T05:44:07+00:00"}, {"id": "https://t.me/c/1240749873/1058", "url": "https://t.me/c/1240749873/1058", "title": "Realm → Свои хранилища → Sharing  Деды помнят мою статью про выпиливание Realm из Додо Пиццы.  Я тог", "content_html": "<strong><del>Realm</del> → <del>Свои хранилища</del> → Sharing</strong><br /><br />Деды помнят мою <a href=\"https://habr.com/ru/companies/dododev/articles/539360/\">статью про выпиливание Realm из Додо Пиццы.</a><br /><br />Я тогда написал хранилище, которое может всяко прикапывать Codable-модельки. Оно прижилось, но не все было удобно и точно не было решением на века. <br /><br />Денис Эгалуев сейчас в кор-команде iOS в Додо, завел канал и рассказывает как переехали с этих хранилищ на <a href=\"https://github.com/pointfreeco/swift-sharing\">Sharing от Point-Free.</a><br /><br /><a href=\"https://t.me/obojekak9koju\">Подписывайтесь</a> и требуйте в комментах историю про парсинг Json Reference в меню пиццы.<br /><br />Я тоже сейчас использую Sharing, про него писали в комментах к прошлым постам, у всех клевый опыт, присмотритесь к либе и вы.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1058-0.jpg\" alt=\"media\"/>", "date_published": "2025-12-09T11:58:10+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1058-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1057", "url": "https://t.me/c/1240749873/1057", "title": "Peekie — тула и либа для парсинга .xcresult  Мы мажорно обновили и сделали ребрендинг нашей либе для", "content_html": "<strong>Peekie — тула и либа для парсинга </strong><code>.xcresult</code><br /><br />Мы мажорно обновили и сделали ребрендинг нашей либе для парсинга результатов тестов.<br /><br />Че нового:<br />- Сменили дурацкое название DBXCResultParser на Peekie — сразу дышаться стало легче.<br />- Влили туда поддержку сонар формата — чтобы выгружать стату по тестам в сонар и смотреть там на красивые графики.<br />- Научились парсить параметризированные тесты — Swift Testing показывается отлично<br />— Поддержали новый эпловый формат <code>xcresulttool</code> — всё чистое, свежее, без использования флагов совместимости со старым форматом. То есть не сдохнет в случайный момент.<br />- Научились парсить компайл-тайм варнинги. Прям вот по каждому модулю и файлу стату говорим, и все тексты прочитать даем. Можно аналитику поверх этого строить.<br /><br />И конечно, оставили самое главное: в проекте есть не только готовая тула, но и СДК, который вы можете подключить куда угодно в свой тулинг и вертеть данные из xcresult как вам надо. <br /><br />Подробнее на гитхабе: <a href=\"https://github.com/dodobrands/Peekie\">Peekie</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1057-0.jpg\" alt=\"media\"/>", "date_published": "2025-12-09T08:38:12+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1057-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1056", "url": "https://t.me/c/1240749873/1056", "title": "", "content_html": "<br /><strong>The video is too large.</strong>", "date_published": "2025-12-07T12:25:26+00:00"}, {"id": "https://t.me/c/1240749873/1048", "url": "https://t.me/c/1240749873/1048", "title": "3D-принтер  В конце прошлого года я купил простой Creality Ender-3 S1 — по сути базовый принтер для ", "content_html": "<strong>3D-принтер</strong><br /><br />В конце прошлого года я купил простой Creality Ender-3 S1 — по сути базовый принтер для печати, на тот момент он стоитл около 32 тысяч рублей. Подписался на несколько каналов с модельками от вархамера и пошел развлекаться. <br /><br />Ну и это было весело! Машина пыхтит пока ты на работе, а вечером получается какая-то новая игрушка. Сын доволен, мне по кайфу собирать, модельки получаются четкие. При этом стандартного сопла достаточно и для того чтобы напечатать фигурки (толщина слоя — 0.08 мм) и что-от для дома можно сделать просто (0.36 мм). <br /><br />По пути еще и раскрашивать научился. Тоже все просто: надо лишь понять сколько слоев разных цветов тебе надо и пару хитрых техник сверху. Интересно, что кисточке не нужна точность:<br /> ⁃ чтобы показать грязь в углах достаточно разбавить краску посильнее<br /> ⁃ чтобы показать всякие царапины нужна наоброт очень сухая кисточка<br /> ⁃ все сколы на краях «железа» рисуются вообще боком кисти. <br />Получается, что раскрашивать 100% может научиться каждый, достаточно посмотреть роликов на ютубе. <br /><br />С раскрашиванием одна проблема — занимает время. А за временем идет и ценность: если фигурки можно печатать по две штуки в день, отдавать детям и не париться, то за сломанные раскрашенные уже обидно. <br /><br />В итоге весь год печатал, смотрел как люди раскрашивают, красил сам, собирал «плейлист» чего еще хочу сделать.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1045-3.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1044-4.jpg\" alt=\"media\"/><br /><strong>The video is too large.</strong>", "date_published": "2025-12-07T12:19:17+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1045-3.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1044-4.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1043", "url": "https://t.me/c/1240749873/1043", "title": "При этом сделали это все Evil Martians (aka Злые Марсиане). Подброней в блоге https://evilmartians.c", "content_html": "При этом сделали это все Evil Martians (aka Злые Марсиане). Подброней в блоге <a href=\"https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl#comparing-oklch-with-other-css-color-formats\">https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl#comparing-oklch-with-other-css-color-formats</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1043-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:17:10+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1043-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1042", "url": "https://t.me/c/1240749873/1042", "title": "Доступность  Хорошо работает и для доступности. Например, можно подбирать достаточную контрастность ", "content_html": "<strong>Доступность</strong><br /><br />Хорошо работает и для доступности. Например, можно подбирать достаточную контрастность между текстов и фоном только по яркости компонента, будет работать во всех цветах.<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1042-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1042-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2025-11-28T14:16:37+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1042-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1041", "url": "https://t.me/c/1240749873/1041", "title": "Темная тема  Удобно работать в темной теме, потому что понимаешь какие параметры как менять.  Разным", "content_html": "<strong>Темная тема</strong><br /><br />Удобно работать в темной теме, потому что понимаешь какие параметры как менять.<br /><br />Разными частям контрола нужные разные правила.<br />- Текст можно сделать насыщеннее в темной теме.<br />- Градиент на фоне надо сильно ослабить и тоже добавить цветности. Ну и перевернуть его.<br />- Тень вообще надо отключить на уровне вьюшки.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1041-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:16:14+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1041-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1040", "url": "https://t.me/c/1240749873/1040", "title": "Градиенты в OKLCH  Это же пространство позволяет строить красивые градиенты. «Обычный» градиент част", "content_html": "<strong>Градиенты в OKLCH</strong><br /><br />Это же пространство позволяет строить красивые градиенты. «Обычный» градиент часто теряет цвет на смешивании, а в OKLCH цвета сохраняются и так намного сочнее. Есть drop-in-replacement либа для градиентов <a href=\"https://github.com/fwrs/OKLCHGradient\">https://github.com/fwrs/OKLCHGradient</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1040-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:15:47+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1040-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1039", "url": "https://t.me/c/1240749873/1039", "title": "Готово: теперь могу менять один цвет, а все производные правильно посчитаются. OKLCH дает удобное пр", "content_html": "Готово: теперь могу менять один цвет, а все производные правильно посчитаются. OKLCH дает удобное пространство для создания дизайн-систем, потому что он хорошо работает с относительными правилами, что позволяет менять цвета не теряя во всех остальных свойствах.<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1039-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1039-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2025-11-28T14:15:39+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1039-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1038", "url": "https://t.me/c/1240749873/1038", "title": "Затем каклькулятором посчитал отношения между цветами. Ключевой цвет вынес в конструктор.", "content_html": "Затем каклькулятором посчитал отношения между цветами. Ключевой цвет вынес в конструктор.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1038-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:15:18+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1038-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1037", "url": "https://t.me/c/1240749873/1037", "title": "Как с этим работать  На Swift есть несколько портов. Я попробовал вот этот https://github.com/niksta", "content_html": "<strong>Как с этим работать</strong><br /><br />На Swift есть несколько портов. Я попробовал вот этот <a href=\"https://github.com/nikstar/swift-oklch\">https://github.com/nikstar/swift-oklch</a> <br /><br />Я брал HEX-код цвета из фигмы, вставлял <a href=\"https://oklch.com/\">на сайт</a>, получал код в OKLCH и переносил в код. Цифры означают ligthness от 0 до 1 (от черного до белого), хрома от 0 до 0.36 (количество цвета) и сам цвет в градусах от 0 до 360.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1037-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:15:08+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1037-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1036", "url": "https://t.me/c/1240749873/1036", "title": "Для решения задачки нужно цветовое пространство OKLCH, оно бережно хранит информацию о воспринимаемо", "content_html": "Для решения задачки нужно цветовое пространство OKLCH, оно бережно хранит информацию о воспринимаемой светлоте. Поиграйтесь на сайте, станет понятней. <a href=\"https://oklch.com/\">https://oklch.com/</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1036-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:14:46+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1036-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1035", "url": "https://t.me/c/1240749873/1035", "title": "Если попытаться описать цвет учитывая его воспнинимаемую яркость, то получится… сложновато.", "content_html": "Если попытаться описать цвет учитывая его воспнинимаемую яркость, то получится… сложновато.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1035-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:14:42+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1035-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1034", "url": "https://t.me/c/1240749873/1034", "title": "Логично, что цвет плашки должен быть один, а все остальное как-то пересчитываться. Вот только пересч", "content_html": "Логично, что цвет плашки должен быть один, а все остальное как-то пересчитываться. Вот только пересчитать это в пространстве RGB почти невозможно, потому что цвета неравномерные: у разных цветов разная яркость и контраст друг к другу. График не похож на сетку? Ну вот это из-за неравномерности.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1034-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:14:30+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1034-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1032", "url": "https://t.me/c/1240749873/1032", "title": "Никто не знает про OKLCH для iOS  Надо бейджики нарисовать. Приходить они будут в API, поэтому надо ", "content_html": "<strong>Никто не знает про OKLCH для iOS</strong><br /><br />Надо бейджики нарисовать. Приходить они будут в API, поэтому надо бы как-то описать контракт. В целом просто: текст и цвет… но какой? В бейджике есть цвет текста, рамки, градиент на фоне и тень. Передавать все? Достаточно одного, но с нюансом — нужно цветовое пространство, в котором удобно работать.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1032-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-28T14:13:57+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1032-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1031", "url": "https://t.me/c/1240749873/1031", "title": "Максим Качинкин начал рассказывать про шейдеры. Если вы хотите выбраться за рамки прямоугольничков, ", "content_html": "Максим Качинкин начал рассказывать про шейдеры. Если вы хотите выбраться за рамки прямоугольничков, то подключайтесь. <br /><br /><a href=\"https://t.me/mobilefiction/368\">https://t.me/mobilefiction/368</a>", "date_published": "2025-11-26T13:25:54+00:00"}, {"id": "https://t.me/c/1240749873/1030", "url": "https://t.me/c/1240749873/1030", "title": "Сережа Орлов рассказал как делали аналог Live Activities. Там много ограничений, но получилось сдела", "content_html": "Сережа Орлов рассказал как делали аналог Live Activities. Там много ограничений, но получилось сделать похожу по функционалу.<br /><br /><a href=\"https://t.me/orlovsdev/3\">https://t.me/orlovsdev/3</a>", "date_published": "2025-11-26T13:25:48+00:00"}, {"id": "https://t.me/c/1240749873/1029", "url": "https://t.me/c/1240749873/1029", "title": "Максим Ковалев рассказывал в Подлодке как упростить работу с документацией через AI. Теперь можно и ", "content_html": "Максим Ковалев рассказывал в Подлодке как упростить работу с документацией через AI. Теперь можно и документацию генерить из текущего кода и новый код по ней и вообще к линтер прикрутить для автоматической проверки. <br /><br /><a href=\"https://www.youtube.com/watch?v=MLexKJgXoQo\">https://www.youtube.com/watch?v=MLexKJgXoQo</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1029-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-26T13:25:43+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1029-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1028", "url": "https://t.me/c/1240749873/1028", "title": "Женя Бондарев завел канал и начинает разработку игры. В канале уже лежит первое видео про дизайн-док", "content_html": "Женя Бондарев завел канал и начинает разработку игры. В канале уже лежит первое видео про дизайн-документ.<br /><br /><a href=\"https://t.me/android_berserk/30\">https://t.me/android_berserk/30</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1028-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-26T13:25:39+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1028-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1027", "url": "https://t.me/c/1240749873/1027", "title": "Новости Android в Додо  Ребята попросили рассказать какой движ наводят", "content_html": "<strong>Новости Android в Додо</strong><br /><br />Ребята попросили рассказать какой движ наводят", "date_published": "2025-11-26T13:25:35+00:00"}, {"id": "https://t.me/c/1240749873/1026", "url": "https://t.me/c/1240749873/1026", "title": "Тестирование скинридера  С другой стороны, AccessibilinySnapshot уже давно требует host application.", "content_html": "<strong>Тестирование скинридера</strong><br /><br />С другой стороны, <a href=\"https://github.com/cashapp/AccessibilitySnapshot\">AccessibilinySnapshot</a> уже давно требует host application. Мне это долго мешало попробовать библиотеку в деле, но вот добрался и кайфанул. <br /><br />Что делает: прицепляет к скриншоту текстовое описание скринридера. На левой картинке видно, что название текстового поля пропало, а заголовок не подписан. Если все починить, то описание это красиво покажет. <br /><br /><a href=\"https://github.com/BarredEwe/Prefire\">Prefire</a> умеет подключать это автоматически.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1026-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-18T11:36:19+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1026-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1025", "url": "https://t.me/c/1240749873/1025", "title": "Скриншот-тесты и стекло  Увы, новый Xcode сломал все скриншот-тесты, где есть контролы со стеклом. И", "content_html": "<strong>Скриншот-тесты и стекло</strong><br /><br />Увы, новый Xcode сломал все скриншот-тесты, где есть контролы со стеклом. <a href=\"https://github.com/pointfreeco/swift-snapshot-testing/issues/1029\">Известное решение</a> — запускать тесты с подключенным <code>host application</code> и включенным <code>drawHierarchyInKeyWindow</code>. <br /><br />Если у вас многомодульность на SPM и вы как-то быстро смогли перенести скриншоты в основное приложение, то расскажите как.", "date_published": "2025-11-18T11:36:04+00:00"}, {"id": "https://t.me/c/1240749873/1024", "url": "https://t.me/c/1240749873/1024", "title": "Китайские ютуберы HTXStudio собрали инвалидное дрифт-кресло. Когда дергаешь за рычаг, оно встаёт на ", "content_html": "Китайские ютуберы HTXStudio собрали инвалидное <strong>дрифт-кресло</strong>. Когда дергаешь за рычаг, оно встаёт на мини-колесики, позволяющие резко входить в повороты.<br /><br />Продавать такое, конечно, не собираются — а это сделали по приколу для коллеги, сломавшего ногу. И для полного кайфа добавили ему ещё массажную спинку, держатель для смартфона и <strong>катапульту в подлокотнике</strong>, которая подкидывает кейс с наушниками прямо в руку.<br /><strong>The video is too large.</strong>", "date_published": "2025-11-10T11:39:44+00:00"}, {"id": "https://t.me/c/1240749873/1023", "url": "https://t.me/c/1240749873/1023", "title": "Когда собираешь примеры про доступность сложно остановиться", "content_html": "Когда собираешь примеры про доступность сложно остановиться", "date_published": "2025-11-10T11:39:44+00:00"}, {"id": "https://t.me/c/1240749873/1022", "url": "https://t.me/c/1240749873/1022", "title": "Если кто пойдет очищать — расскажите сколько получилось освободить", "content_html": "Если кто пойдет очищать — расскажите сколько получилось освободить", "date_published": "2025-11-06T12:11:36+00:00"}, {"id": "https://t.me/c/1240749873/1021", "url": "https://t.me/c/1240749873/1021", "title": "DevCleaner  Затем еще много всякого, но все это вычищает програма DevCleaner. Любимая фича — статист", "content_html": "<strong>DevCleaner</strong><br /><br />Затем еще много всякого, но все это вычищает програма DevCleaner. Любимая фича — статистика в нижней полоске, за несколько лет прила очистила 900 гигов!<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1021-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-06T12:11:15+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1021-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1020", "url": "https://t.me/c/1240749873/1020", "title": "Кеш симуляторов  Из образов Xcode создает реальный симулятор и запоминает что в нем делали: установл", "content_html": "<strong>Кеш симуляторов</strong><br /><br />Из образов Xcode создает реальный симулятор и запоминает что в нем делали: установленные приложения, настройки, вкладки браузера и т.п. Из-за версионирования он также создает кучу клонов, которые занимают место. <br /><br />Удалить все разом можно тут <code>~/Library/Developer/CoreSimulator</code>. Папка скрытая, чтобы ее увидеть нажмите CMD+Shift+.", "date_published": "2025-11-06T12:10:52+00:00"}, {"id": "https://t.me/c/1240749873/1019", "url": "https://t.me/c/1240749873/1019", "title": "Бывают случаи, что он показывает не все, тогда можно проверить через терминал, но у меня через него ", "content_html": "Бывают случаи, что он показывает не все, тогда можно проверить через терминал, но у меня через него не удалялось. <br /><br /><code>xcrun simctl list runtimes</code><br /><code>xcrun simctl delete all</code>", "date_published": "2025-11-06T12:10:45+00:00"}, {"id": "https://t.me/c/1240749873/1018", "url": "https://t.me/c/1240749873/1018", "title": "Удалить можно через сам Xcode: Settings -&gt; Components. Там внизу экран надо поскролить, смотрите ", "content_html": "Удалить можно через сам Xcode: Settings -&gt; Components. Там внизу экран надо поскролить, смотрите сколько фигни он хранит и насколько она устарела:<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1018-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-06T12:10:41+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1018-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1017", "url": "https://t.me/c/1240749873/1017", "title": "Образы симуляторов  Симуляторы создаются из образов, которые хранятся по пути /System/Library/Assets", "content_html": "<strong>Образы симуляторов</strong><br /><br />Симуляторы создаются из образов, которые хранятся по пути <code>/System/Library/AssetsV2</code>. Проблема в том, что при каждом обновлении Xcode за собой ничего не подчищает. Так у меня накопилось 100 гигобайт в этой папке. Причем просто так ее даже не удалить, она же в <code>/System</code>!<br /><br />В целом для анализа где и что занимает место хорошо подходит OmniDiskSweeper. Он показываем все папки и сколько весят, легко находить куда место «утекло»:<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1017-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-06T12:10:30+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1017-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1016", "url": "https://t.me/c/1240749873/1016", "title": "Чистим после Xcode   Наступила осень, скорее всего вы обновились на новый Xcode, поэтому время почис", "content_html": "<strong>Чистим после Xcode </strong><br /><br />Наступила осень, скорее всего вы обновились на новый Xcode, поэтому время почистить за ним. Освободил себе 250 гигов, напомню где что лежит, потому что мусорит Xcode знатно.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1016-0.jpg\" alt=\"media\"/>", "date_published": "2025-11-06T12:10:16+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1016-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1015", "url": "https://t.me/c/1240749873/1015", "title": "PaymentSDK  В Додо Пицце самый большой и долгий проект среди фичевых что я делал — общий платежный м", "content_html": "<strong>PaymentSDK</strong><br /><br />В Додо Пицце самый большой и долгий проект среди фичевых что я делал — общий платежный модуль на все приложения. Задачка амбициозная, ведь уже у пиццы пара десятков стран, десятки способов оплаты и платежных провайдеров, все они не хотят рассказывать как шифровать данные и хотят встроить свой сдк с формой ввода. Приправляем все это требованиями по безопасности и становится реально сложно. <br /><br />В итоге получилось не тянуть вот такие сдк по 50 мегабайт, горжусь", "date_published": "2025-10-21T14:26:15+00:00"}, {"id": "https://t.me/c/1240749873/1014", "url": "https://t.me/c/1240749873/1014", "title": "Это KMP!  Я пошел проверить сколько все это весит:  ⁃ приложение весило 56 мегабайт (а внутри видос ", "content_html": "Это KMP!<br /><br />Я пошел проверить сколько все это весит:<br /> ⁃ приложение весило 56 мегабайт (а внутри видос на 12 мб), <br /> ⁃ стало — 106 мегабайт. 50 мегабайт на один экран ввода данных!<br /><br />Никогда такого не было и вот опять: по внешним симптомам набрел на технологическую лажу.  Считаю, что слепой тест на KMP пройден. <br /><br /><a href=\"https://checkout.wd3.myworkdayjobs.com/en-GB/CheckoutCareers/job/Senior-Software-Engineer--Mobile---Swift--Kotlin_R7752\">Вакансия открыта в Лондоне</a>, налетайте починить.", "date_published": "2025-10-21T14:25:57+00:00"}, {"id": "https://t.me/c/1240749873/1013", "url": "https://t.me/c/1240749873/1013", "title": "Слепой тест на определение фреймворка  Интегрирую SDK от Checkout.com, чтобы данные карты, шифровать", "content_html": "<strong>Слепой тест на определение фреймворка</strong><br /><br />Интегрирую SDK от <a href=\"http://Checkout.com/\">Checkout.com</a>, чтобы данные карты, шифровать и потом процессить платеж. Как и большинство интеграций, работает отвратительно: <br /> ⁃ Устанавливается через SPM, но бинарником и автокомплит не работает. Разрабатываешь вслепую переписывая из семпла<br /> ⁃ Вьюшка на SwiftUI, но чет так сделано, что я ваще не понял как это нормально встраиваться должно<br /> ⁃ Дока содержит обрывки кода<br /> ⁃ Кастомизация интерфейса есть, но сделана будто случайно. <br /> ⁃ Валидация формы работает как-то постфактум, после нажатия кнопки оплаты. Фокус в форму автоматом не встает и прочие мелочи. <br /><br />Затем мы включили одну фичу и начала вылетать:<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1013-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1012-1.jpg\" alt=\"media\"/>", "date_published": "2025-10-21T14:25:55+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1013-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1012-1.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1011", "url": "https://t.me/c/1240749873/1011", "title": "Как вы платите за обучение?  Не анонс, но пишу большой артефакт про тестирование на мобиле. Выходит ", "content_html": "<strong>Как вы платите за обучение?</strong><br /><br />Не анонс, но пишу большой артефакт про тестирование на мобиле. Выходит клево, но не хочу раздавать бесплатно. Поэтому вопрос: расскажите как вы платили за обучающие материалы последний год? Какие форматы вам нравятся, а какие нет?<br /><br />Примеры:<br /> ⁃ Купил годовую подписку на Point-Free, они регулярно рассказывают про свои либы и подходы, поэтому нормально. <br /> ⁃ Разово заплатил за книгу про SwiftUI, на нее приходят бесплатные апдейты каждый год. <br /> ⁃ Проходил видео-курс. Доступ к лекциям был полгода. <br /> ⁃ Подписан на полку книг Бюро Горбунова. <br /> ⁃ Подписан на бусти какого-то автора<br /> ⁃ Есть подписка на платный телеграмм-канал<br /><br />Может за что-то платили сами, а что-то оплатила компания?", "date_published": "2025-10-14T13:33:13+00:00"}, {"id": "https://t.me/c/1240749873/1010", "url": "https://t.me/c/1240749873/1010", "title": "Мой первый вайб-кодинг баг  Надо было сгруппировать транзакции по дням, при этом даты писать относит", "content_html": "<strong>Мой первый вайб-кодинг баг</strong><br /><br />Надо было сгруппировать транзакции по дням, при этом даты писать относительно: сегодня, вчера, 5 октября, 12 января 2024. Самому делать муторно: надо чет скучное написать, при этом тестов куча будет, с датами и форматированием надо разбираться и т.п. <br /><br />LLM справился оч хорошо: сам придумал формат данных, отделил интерфейсом, чтобы любые объекты с датой группировать можно было, написал кучу корнер кейсов и т.п. Я прогнал тесты, почитал, что он прям правильные кейсы написал (типо не надо писать, что 7 октября 2024 года это «сегодня», потому что день одинаковый, но год разный). Запустил, проверил, все правильно сработало. Это все еще до первого релиза было. <br /><br />И вот на третий месяц после релиза нам пишут, что чет «вчерашние» транзакции ваще непонятные. Смотрим, оказывается что он показывает транзакции за 3 августа, 3 сентября, 3 октября — все было «вчера». В общем, он полностью забыл проверить месяца. <br /><br />Так получилось, потому что LLM слишком хорошо протестировал кейсы на «сегодня», поэтому я убавил бдительность когда читал тесты на «вчера», а он и продолбал там несколько вариантов. <br /><br />Доверяй, но проверяй.", "date_published": "2025-10-07T12:03:20+00:00"}, {"id": "https://t.me/c/1240749873/1009", "url": "https://t.me/c/1240749873/1009", "title": "Найм через два года  Главный вопрос технической стратегии развития продукта — что и как мы будем дел", "content_html": "<strong>Найм через два года</strong><br /><br />Главный вопрос технической стратегии развития продукта — что и как мы будем делать через год, два, пять. Чтобы принять решения надо смотреть на стек технологий, уровень разработчиков, размер команды, текучку кадров и т.п. <br /><br />Свойств про людей больше чем про технологии, потому что одно на второе влияет. Например, много людей → много кода, а если людей мало, то надо или сэкономить объем того, что нужно написать (через макросы) или научиться писать много (через LLM). <br /><br />Больше всего на мои решения влиял «найм через два года». Потому что в среднем мы нанимали ребят которые программировали для iOS примерно 4 года, а значит тот, кого мы наймем через два года, прямо сейчас уже пару лет пишет для iOS. <br /><br />Что такой разработчик использует в работе в 2025? <br /> ⁃ 100% он пишет на SwiftUI, потому что просто с него начал. И пишет он на API которые выше 16 iOS, потому что ну а нафига ему требования ниже. <br /> ⁃ И пакеты он на SPM подключает, потому что Cocoapods это что-то на дедовском. <br /> ⁃ Async/await он использует, потому что синтаксис для колбеков сложно запомнить даже. <br /> ⁃ Про тесты и многомодульность он ничего не знает, потому что зачем ему это. <br /> ⁃ Он работал в небольших проектах: если мы нанимаем не в Москве, то это всего 1-3 иосника на проект и соответсвующие скилы на выходе. <br /><br />Итоговая мысль: проект должен быть готов к тому, чтобы такие разработчики приходили в него. В стартапе все тоже самое.", "date_published": "2025-10-01T14:56:31+00:00"}, {"id": "https://t.me/c/1240749873/1008", "url": "https://t.me/c/1240749873/1008", "title": "Каждому пункту меню поставили по иконке. Интересно изучать как:  ⁃ дизайнер мучается: различий миним", "content_html": "Каждому пункту меню поставили по иконке. Интересно изучать как:<br /> ⁃ дизайнер мучается: различий минимум, иконка Commit ваще не в тему. <br /> ⁃ дизайнер не справился и не всем пунктам есть иконка.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1008-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-12T11:53:24+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1008-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1007", "url": "https://t.me/c/1240749873/1007", "title": "MacOS Tahoe  А потом я поставил MacOS Tahoe. Вот это очень плохо: обвели все кнопки, все поставили н", "content_html": "<strong>MacOS Tahoe</strong><br /><br />А потом я поставил MacOS Tahoe. Вот это очень плохо: обвели все кнопки, все поставили на панельки, всему добавили иконки. Плохо даже на маленьком примере, смотрите насколько сложнее стало<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1007-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--1006-1.jpg\" alt=\"media\"/>", "date_published": "2025-09-12T11:52:58+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1007-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--1006-1.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/1005", "url": "https://t.me/c/1240749873/1005", "title": "В сумме  Ликвид гласс это очень сильное решение на вижене, прям в учебник в раздел «мне пофиг, я так", "content_html": "<strong>В сумме</strong><br /><br />Ликвид гласс это очень сильное решение на вижене, прям в учебник в раздел «мне пофиг, я так вижу». Местами он прекрасен и это сильно продает, местами он отвратителен даже в стандартных приложениях. Интересно будет как починят. <br /><br />Поделитесь как у вас прошел процесс: стало лучше, хуже или забили и добавили <code>UIDesignRequiresCompatibility</code> в <code>Info.plist</code>?", "date_published": "2025-09-12T11:52:29+00:00"}, {"id": "https://t.me/c/1240749873/1004", "url": "https://t.me/c/1240749873/1004", "title": "Отдельно понравилось как стекло подходит редактированию текста, потому что самое важное — этот текст", "content_html": "Отдельно понравилось как стекло подходит редактированию текста, потому что самое важное — этот текст, а интерфейс строится поверх него. Кароч стандартные заметки стали еще прикольней.", "date_published": "2025-09-12T11:52:19+00:00"}, {"id": "https://t.me/c/1240749873/1003", "url": "https://t.me/c/1240749873/1003", "title": "Захотели когда-то кастомный сегмент контрол и писали его неделю? В новом эффекте стекла обалденный, ", "content_html": "Захотели когда-то кастомный сегмент контрол и писали его неделю? В новом эффекте стекла обалденный, очень жаль, что ваш старый такой скучный теперь. Хотя и иосный странно на белый фон накладывается, дерганый какой-то.", "date_published": "2025-09-12T11:51:57+00:00"}, {"id": "https://t.me/c/1240749873/1002", "url": "https://t.me/c/1240749873/1002", "title": "Но дизайн это хау ит воркс (т.е. в динамике), а не хау ти лукс (в статике). Ну и смотрите как это же", "content_html": "Но дизайн это хау ит воркс (т.е. в динамике), а не хау ти лукс (в статике). Ну и смотрите как это же все работает без костылей в iOS 26. Ну, красиво!<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1002-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1002-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2025-09-12T11:51:48+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1002-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1001", "url": "https://t.me/c/1240749873/1001", "title": "Через пару месяцев обнаружили, что раз такой заголовок оказывается внутри экрана, то и стандартное п", "content_html": "Через пару месяцев обнаружили, что раз такой заголовок оказывается внутри экрана, то и стандартное поле поиска встанет выше заголовка. Плюс это поле маленькое, поэтому давайте свой поиск задаизайним… Кароч в череде микро-решений оказались в такой ситуации как на видео. И если в макете оно выглядит еще нормально, то вот при скроле уже превращается в кашу и места под контент оказывается мало.<br /><video controls poster=\"https://tg.davvie.com/static/-1001240749873--1001-0.mp4\" style=\"max-width:100%;\"><source src=\"https://tg.davvie.com/static/-1001240749873--1001-0.mp4\" type=\"video/mp4\">Your browser does not support the video tag.</video>", "date_published": "2025-09-12T11:51:22+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1001-0.mp4", "mime_type": "video/mp4"}]}, {"id": "https://t.me/c/1240749873/1000", "url": "https://t.me/c/1240749873/1000", "title": "Старые костыли  Все старые дизайнерские костыли костыли дали о себе знать и я их просто выпиливал.  ", "content_html": "<strong>Старые костыли</strong><br /><br />Все старые дизайнерские костыли костыли дали о себе знать и я их просто выпиливал. <br /><br />Например, мы захотели сделать заголовки в две строки, потому что это хорошо ложилось на онбординг.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--1000-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-12T11:51:07+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--1000-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/999", "url": "https://t.me/c/1240749873/999", "title": "При изменении размера шита меняется его прозрачность, а значит, что меняется и контраст между кнопка", "content_html": "При изменении размера шита меняется его прозрачность, а значит, что меняется и контраст между кнопками… в итоге делаешь норм контраст для прозрачности, а он задирается при полном раскрытии. Ну что за люди<br /><strong>The video is too large.</strong>", "date_published": "2025-09-12T11:51:03+00:00"}, {"id": "https://t.me/c/1240749873/998", "url": "https://t.me/c/1240749873/998", "title": "По пути ещё ресайз под контент отвалился и начал открываться как-то из угла, вовремя помогло видео о", "content_html": "По пути ещё ресайз под контент отвалился и начал открываться как-то из угла, вовремя помогло видео от kavasoft. <br /><br /><a href=\"https://www.youtube.com/watch?v=KM3nXKnOmvM\">https://www.youtube.com/watch?v=KM3nXKnOmvM</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--998-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-12T11:50:11+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--998-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/997", "url": "https://t.me/c/1240749873/997", "title": "Боттом шиты  Боттом шиты просто неюзабельны с  прозрачностью, поэтому я добавил им пятидесятипроцент", "content_html": "<strong>Боттом шиты</strong><br /><br />Боттом шиты просто неюзабельны с  прозрачностью, поэтому я добавил им пятидесятипроцентную заливку фоновым цветом.<br /><img src=\"https://tg.davvie.com/static/-1001240749873--997-0.jpg\" alt=\"media\"/><br /><img src=\"https://tg.davvie.com/static/-1001240749873--996-1.jpg\" alt=\"media\"/>", "date_published": "2025-09-12T11:50:06+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--997-0.jpg", "mime_type": "image/jpeg"}, {"url": "https://tg.davvie.com/static/-1001240749873--996-1.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/995", "url": "https://t.me/c/1240749873/995", "title": "Еще из-за этой стилизации у меня получилось два набора кнопок для тулбара: один я использую в своих ", "content_html": "Еще из-за этой стилизации у меня получилось два набора кнопок для тулбара: один я использую в своих боттом-шитах, там я сам добавляю стекло, а отдельный (такой же, но без стекла) нужен для для настоящего тулбара, он там добавит стекло сам. Кто это все придумал — уволить, от его работы только планета греется. <br /><br />Нажимать в большие кнопки тулбара которые при нажатии становятся еще больше ПРИЯТНО. Дизайнеры, которые 10 лет мельчили в макетах — вам привет. <br /><br />В добавок разные алерты показываются в контексте. Обожаю это в любой программе, но чет API работает только с кнопками в тулбаре сверху и снизу. Можно ли из своих кнопок показывать?", "date_published": "2025-09-12T11:49:46+00:00"}, {"id": "https://t.me/c/1240749873/994", "url": "https://t.me/c/1240749873/994", "title": "Если раньше у вас просто могли стоять одинаковые кнопки в правом верхнем углу и при навигации все бы", "content_html": "Если раньше у вас просто могли стоять одинаковые кнопки в правом верхнем углу и при навигации все было незаметно, то теперь есть анимация обновления с кнопки закрыть на кнопку закрыть, топ!", "date_published": "2025-09-12T11:49:32+00:00"}, {"id": "https://t.me/c/1240749873/993", "url": "https://t.me/c/1240749873/993", "title": "Тулбар  В тулбаре кнопки автоматом стали круглыми. Что, зачем, как отключить? Зато растягивать можно", "content_html": "<strong>Тулбар</strong><br /><br />В тулбаре кнопки автоматом стали круглыми. Что, зачем, как отключить? Зато растягивать можно иконку профиля, очень смешно.", "date_published": "2025-09-12T11:49:15+00:00"}, {"id": "https://t.me/c/1240749873/992", "url": "https://t.me/c/1240749873/992", "title": "А контраста явно не хватает! Пробуешь увеличить контраст для кнопок, добавляешь 95% белого, а получа", "content_html": "А контраста явно не хватает! Пробуешь увеличить контраст для кнопок, добавляешь 95% белого, а получаешь меньший контраст, потому что теперь цвет кнопки с тенью смешивается. На трансляции гугл мита дизайнеру будет казаться, что стало лучше, но на самом деле стало хуже. Ребятаааа, спокойствия всем нам договориться. <br /><br />Понятно, что крупные кнопочки можно стеклом покрасить и будет клево. Нам повезло, у нас есть типо серебристые и золотые кнопки, в них эффект прямо попал. <br /><br />Вот что делать с разными остальными — большой вопрос. Я попробовал чуть поправить стили кнопок, но в моих была и покраска и реакция на нажатие, все это пришлось убрать. В целом совет — кнопки для iOS 26 дизайните с ноля.", "date_published": "2025-09-12T11:49:06+00:00"}, {"id": "https://t.me/c/1240749873/991", "url": "https://t.me/c/1240749873/991", "title": "Кнопочки  Проблема нового дизайна стекла: в «обычных», не «медиа» интерфейсах основной эффект это «б", "content_html": "<strong>Кнопочки</strong><br /><br />Проблема нового дизайна стекла: в «обычных», не «медиа» интерфейсах основной эффект это «белое на белом»: свечение стекла сделано через HDR, поэтому вы не сможете дизайнеру показать результат не на трансляции, не на скриншоте. Как это адекватно дизайнить – вопрос. В настройках телефона можно включить скринкаст в HDR, я наснимал, чтобы вам показать, а оказалось, что телега не умеет HDR-видео показывать, поэтому придется прикреплять файлами, снимать все заново я не буду.", "date_published": "2025-09-12T11:48:44+00:00"}, {"id": "https://t.me/c/1240749873/990", "url": "https://t.me/c/1240749873/990", "title": "Миграция на iOS 26  Xcode Release Candidate уже вышел, можно отправлять прилы, расскажу что поменял ", "content_html": "<strong>Миграция на iOS 26</strong><br /><br />Xcode Release Candidate уже вышел, можно отправлять прилы, расскажу что поменял в своей. Но чет этот процесс оказался хуже чем я представлял. <br /><br /><strong>Сборка</strong><br /> ⁃ Проект собрался нормально, но гугловую капчу пришлось отключить, ждем билда либы из релизной сборки Xcode. <br /> ⁃ Скриншот-тесты не рендерят стекло. СПАСИБО<br /><br />Все изменения для iOS 26 я сделал заранее, но если втупую закрыть их флагом по версии, то при сборке из старого Xcode и запуске из новой iOS — интерфейс разломатся полностью. Поэтому я делал так:<br /><br /><pre><br />    <code class='language-swift'><br />        <br />if #available(iOS 26.0, *), iOS26Allowed {<br /> // …<br />} else if #available(iOS 18.0, *) {<br /> // …                            <br />} else {<br /> // … iOS 17 and lower                           <br />}<br />{}<br />    </code><br /></pre><br />и дополнительный хелпер смотрел, что я собираю из правильного Xcode<br /><pre><br />    <code class='language-swift'><br />        <br />@MainActor<br />public var iOS26Allowed: Bool {<br />#if swift(&gt;=6.2)<br />    true<br />#else<br />    false<br />#endif<br />}{}<br />    </code><br /></pre>", "date_published": "2025-09-12T11:48:40+00:00"}, {"id": "https://t.me/c/1240749873/989", "url": "https://t.me/c/1240749873/989", "title": "📱System Design в мобильной разработке — это про архитектуру, которая выходит за рамки экранов и нави", "content_html": "📱<strong>System Design в мобильной разработке — это про архитектуру, которая выходит за рамки экранов и навигации.<br /><br /></strong>Чтобы приложения масштабировались, выдерживали нагрузку и не ломались при росте — нужен системный подход.<br /><br />Как выстроить его на практике? Подробно обсудим это на <a href=\"https://podlodka.io/droidcrew?utm_campaign=early_bird_android_crew_14&amp;utm_source=telegram&amp;utm_medium=social&amp;utm_content=RubanovMobile\"><strong>Podlodka Android Crew,</strong></a><strong> 15-19 сентября.</strong><br /><br />В программе:<br /><br />🧩 <strong>Бинарная совместимость</strong>: где с ней сталкиваются мобильные разработчики и какие ошибки чаще всего приводят к проблемам. (Абакар Магомедов, Альфа-Банк)<br /><br />🏗️ <strong>Мобильный архитектор</strong>: какие решения он принимает и почему без этой роли сложно развивать сложные приложения. (Эдуард Некрутов, Blink)<br /><br />⚙️ <strong>Dependency Injection в KMP</strong>: обзор фреймворков и разбор, как выбрать подходящее решение под проект. (Александр Власюк, РайффайзенБанк)<br /><br />⚡️<strong>BDUI в Android: опыт от DivKit, Beduin и Duit</strong>. Как перестать хардкодить экраны и ускорить эксперименты, чтобы быстрее проверять гипотезы.<br /><br />🔗 <strong>Подключайся — будет полезно: </strong><a href=\"https://podlodka.io/droidcrew?utm_campaign=early_bird_android_crew_14&amp;utm_source=telegram&amp;utm_medium=social&amp;utm_content=RubanovMobile\">https://podlodka.io/droidcrew</a><br /><br />А промкод R_MOBILE дает скидку 500р🥳<br /><img src=\"https://tg.davvie.com/static/-1001240749873--989-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-10T15:52:01+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--989-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/988", "url": "https://t.me/c/1240749873/988", "title": "Разыгрываю проходку на Android-подлодку. Разыграю среди откомментировавших: можно написать что угодн", "content_html": "Разыгрываю проходку на Android-подлодку. Разыграю среди откомментировавших: можно написать что угодно, а можно про то, как любишь другую платформу, как дела с KMP, в целом про опыт на другой платформе. <br /><br />Победителя выберу случайно. Ну или если вдруг огненный коммент будет — могу отдать и по велению сердца", "date_published": "2025-09-10T15:51:52+00:00"}, {"id": "https://t.me/c/1240749873/987", "url": "https://t.me/c/1240749873/987", "title": "Декларативая музыка  Оказывается, Live Coding — это не только один из этапов собеседований в Яндекс,", "content_html": "<strong>Декларативая музыка</strong><br /><br />Оказывается, Live Coding — это не только один из этапов собеседований в Яндекс, но и целое направление в музыке.<br /><br />Исполнитель в режиме реального времени пишет код, математически описывающий звуки и ритмы.<br /><br />В общем, представить это трудно, но можно посмотреть:<br /><br />1. <a href=\"https://youtu.be/W24pteoigXk\">https://youtu.be/W24pteoigXk</a><br /><br />2. <a href=\"https://youtu.be/HkgV_-nJOuE\">https://youtu.be/HkgV_-nJOuE</a><br /><br />Самый популярная платформа для лайвкодинга музыки, Strudel, основана на JavaScript и доступна прямо в браузере <a href=\"https://strudel.cc/\">тут</a>, так что можно и попробовать.<br /><br /><del>Ждем версию на Kotlin</del><br /><img src=\"https://tg.davvie.com/static/-1001240749873--987-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-06T17:20:18+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--987-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/986", "url": "https://t.me/c/1240749873/986", "title": "Недавно наткнулся на эти видео и очень хотел поделиться с вами, но не знал как описать и что за софт", "content_html": "Недавно наткнулся на эти видео и очень хотел поделиться с вами, но не знал как описать и что за софт. Но вот тут все что надо написали", "date_published": "2025-09-06T17:20:18+00:00"}, {"id": "https://t.me/c/1240749873/985", "url": "https://t.me/c/1240749873/985", "title": "🤩 Готовы к следующему уровню в автоматизации?  17 сентября стартует флагманский курс по автоматизаци", "content_html": "🤩 <strong>Готовы к следующему уровню в автоматизации?</strong><br /><br /><a href=\"https://qa.guru/java-advanced?utm_source=telegram&amp;utm_medium=newschannel&amp;utm_campaign=post509\"><strong>17 сентября стартует флагманский курс по автоматизации тестирования на Java Advanced</strong></a><a href=\"https://qa.guru/java-advanced?utm_source=telegram&amp;utm_medium=newschannel&amp;utm_campaign=post509\">!</a><br /><br />🛒 Забронируйте место со скидкой 5%! Присылайте кодовое слово:  ADVANCED5 нашему менеджеру @qa_guru_sales1<br /><br />Отличная возможность прокачать навыки до уровня Senior+, собрать впечатляющее портфолио и освоить самые востребованные технологии автоматизации.<br /><br />Кстати, вебинар <strong>«Как заглянуть в любой уголок приложения через скриншот-тесты»</strong> уже доступен в записи!👇<br /><br /><strong>Вы найдёте его на:</strong><br />— <a href=\"https://school.qa.guru/pl/teach/control/lesson/view?id=344030954&amp;editMode=1&amp;utm_source=telegram&amp;utm_medium=newschannel&amp;utm_campaign=post509\">платформе школы</a><br />— <a href=\"https://www.youtube.com/watch?v=8On9oPSf8h0\">YouTube</a><br />— <a href=\"https://rutube.ru/video/66b5b9c676fe6a4d835a967cc9c4b8e9/\">Rutube</a><br /><br /><strong>Среди преподавателей курса:</strong><br />— <strong>Дмитрий Тучс</strong> — Head of QA в Dodo Brands, 16+ лет в IT<br />— <strong>Михаил Рубанов</strong> — автор книги «Про доступность iOS», экс-head of mobile в Dodo Engineering<br /><br />💡 <strong>За 6 месяцев вы научитесь:</strong><br /><br />— Работать с <strong>JUnit extension</strong> и <strong>паттернами</strong> (decorator, singleton, factory, IOC)<br />— Тестировать <strong>gRPC, GraphQL, SOAP</strong>, работать с <strong>БД, Kafka, docker</strong> и <strong>docker-compose</strong><br />— Создавать <strong>код с нуля</strong> и понимать, как всё устроено в <strong>Spring Boot</strong> под капотом<br /><br /><a href=\"https://qa.guru/go-javaadv?utm_source=telegram&amp;utm_medium=sponsored&amp;utm_campaign=pad409&amp;utm_content=name\">Успейте зарегистрироваться со скидкой</a> 🔥<br /><img src=\"https://tg.davvie.com/static/-1001240749873--985-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-05T12:53:37+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--985-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/984", "url": "https://t.me/c/1240749873/984", "title": "Запись готова. Получилось клево, пишите вопросы в комментарии", "content_html": "Запись готова. Получилось клево, пишите вопросы в комментарии", "date_published": "2025-09-05T12:53:36+00:00"}, {"id": "https://t.me/c/1240749873/983", "url": "https://t.me/c/1240749873/983", "title": "Поехали!   Подключайтесь узнать больше про скриншот-тесты", "content_html": "Поехали! <br /><br /><a href=\"https://school.qa.guru/pl/webinar/show?id=3054539&amp;view=1\">Подключайтесь узнать больше про скриншот-тесты</a>", "date_published": "2025-09-04T12:59:52+00:00"}, {"id": "https://t.me/c/1240749873/982", "url": "https://t.me/c/1240749873/982", "title": "Встреча про скриншот-тесты начнется через 30 минут. Особо полезно будет тем, кто еще не пишет никаки", "content_html": "Встреча про скриншот-тесты начнется через 30 минут. Особо полезно будет тем, кто еще не пишет никакие тесты или хочет начать внедрять скриншот-тесты, но не знает с чего начать. <br /><br />Много чего покажу, расскажу, будет клево", "date_published": "2025-09-04T12:34:19+00:00"}, {"id": "https://t.me/c/1240749873/981", "url": "https://t.me/c/1240749873/981", "title": "👨‍💻 Скриншот-тесты помогают ловить визуальные баги там, где обычные автотесты бессильны:  В интерфей", "content_html": "👨‍💻 <strong>Скриншот-тесты помогают ловить визуальные баги там, где обычные автотесты бессильны:<br /></strong><br />В интерфейсе мобильных приложений, при проверке верстки, отображения компонентов, тем и локализаций. Они позволяют быть уверенным, что дизайн и логика отображаются так, как задумано.<br /><br />🔜 <strong>Уже 4-го сентября в 16:00 ждём вас на бесплатном вебинаре — «Как заглянуть в любой уголок приложения через скриншот-тесты»!</strong><br /><br /><a href=\"https://qa.guru/screenshot-tsts-automation?utm_source=telegram&amp;utm_medium=newschannel&amp;utm_campaign=post209\">Регистрируйтесь прямо сейчас и забирайте карьерный гайд в подарок</a> ✔️<br /><br /><strong>Преподаватель расскажет и покажет:<br /></strong><br />– зачем нужны скриншот-тесты и что они дают<br />– как работать с библиотекой от PointFree<br />– как автоматизировать всё через Prefire<br />– как скриншот-тесты влияют на командные процессы и что ещё можно с их помощью автоматизировать<br /><br />🎙 <strong>Спикер — Михаил Рубанов</strong><br />– 12 лет в мобильной разработке<br />– экс-хед мобильного направления в Dodo Brands<br />– автор книги «Про доступность iOS», а также соавтор курса по автоматизации тестирования<br />на Java Advanced<br />– на данный момент в финтехе<br /><br />🔗 <a href=\"https://qa.guru/screenshot-tsts-automation?utm_source=telegram&amp;utm_medium=newschannel&amp;utm_campaign=post209\">Занимайте место на вебинар и забирайте бонус!</a><br /><img src=\"https://tg.davvie.com/static/-1001240749873--981-0.jpg\" alt=\"media\"/>", "date_published": "2025-09-02T15:00:46+00:00", "attachments": [{"url": "https://tg.davvie.com/static/-1001240749873--981-0.jpg", "mime_type": "image/jpeg"}]}, {"id": "https://t.me/c/1240749873/979", "url": "https://t.me/c/1240749873/979", "title": "Про скриншот-тесты я рассказываю на ближайшей публичной встрече QA-Guru, если вы никак с ними не раб", "content_html": "Про скриншот-тесты я рассказываю на ближайшей публичной встрече QA-Guru, если вы никак с ними не работали, то обязательно приходите. Покажу разные скриншоты и подходы как из Додо Пиццы, так и из моего нового проекта — электронного кошелька Jazari.", "date_published": "2025-09-02T14:59:49+00:00"}, {"id": "https://t.me/c/1240749873/978", "url": "https://t.me/c/1240749873/978", "title": "Итоги  Помогло ли мне это? Очень. Кучу сценариев сложно воспроизводить, оказывается быстрее подготов", "content_html": "<strong>Итоги</strong><br /><br />Помогло ли мне это? Очень. Кучу сценариев сложно воспроизводить, оказывается быстрее подготовить инфраструктуру и писать тесты. Писать тесты не просто: я постоянно немного подтюнивал инфраструктуру, чтобы тест вообще можно было написать. Dependency, Perception и Swift Navigation сильно упростили мою работу, респект Point Free.", "date_published": "2025-09-02T14:59:31+00:00"}, {"id": "https://t.me/c/1240749873/977", "url": "https://t.me/c/1240749873/977", "title": "UI-тесты  UI-тесты я честно начал писать, но для них понадобилось много воркэраундов. Например:  ⁃ д", "content_html": "<strong>UI-тесты</strong><br /><br />UI-тесты я честно начал писать, но для них понадобилось много воркэраундов. Например:<br /> ⁃ для онбординга надо пройти верификацию через камеру — мы написали симуляторную функцию, но она тоже нестабильно работает. <br /> ⁃ для пополнения счета надо открывать вебвьюшку с сайтом от банков-партнеров, но она чет очень нестабильно работает. <br /> ⁃ переводы денег тратят баланс, а для его проверки и пополнения нужен прошлый пункт<br /><br />Получается, что надо очень хорошо подойти к инфраструктуре симуляторов, чтобы они стабильно работали. Раз я уже смог проверить сценарии через тесты для сценариев, то я отложил UI-тесты до лучших времен, хотя сценариев там уже набралось.", "date_published": "2025-09-02T14:59:21+00:00"}, {"id": "https://t.me/c/1240749873/976", "url": "https://t.me/c/1240749873/976", "title": "Вспомогательные функции тоже очень простые: viewModel(route: \\.countries) это следствие от использов", "content_html": "Вспомогательные функции тоже очень простые: <code>viewModel(route: \\.countries)</code> это следствие от использования Swift Navigation + для каждого экрана написано что-то очень простое в духе загрузить-ввести-отправить:<br /><br /><pre><br />    <code class='language-swift'><br />        <br />extension ProvidersViewModel {<br />    func selectNew() async throws {<br />        try await load()<br />        select(provider: nil)<br />    }<br />}{}<br />    </code><br /></pre>", "date_published": "2025-09-02T14:59:12+00:00"}, {"id": "https://t.me/c/1240749873/975", "url": "https://t.me/c/1240749873/975", "title": "Тест на сценарий  Иногда мне нужно проверить переходы между экранами, например, я завожу аккаунт нов", "content_html": "<strong>Тест на сценарий</strong><br /><br />Иногда мне нужно проверить переходы между экранами, например, я завожу аккаунт нового человека чтобы отправить ему международный перевод. В таком случае я проверяю переходы между экранами и передачу данных между ними. Приходится побольше застабать, но если до этого тестировал отдельные экраны через скриншоты и стабал данные, то это уже несложно повторить. <br /><br /><pre><br />    <code class='language-swift'><br />        <br />@Test(.dependencies { deps in<br />    deps.api = APIStub.builder()<br />    // Saved Beneficiaries<br />        .success(RemittanceAPI.savedBeneficiaries(), [.testMake()])<br />    // New beneficiary<br />        .success(RemittanceAPI.countries(), .testMake())<br />        .success(RemittanceAPI.providers(toCountry: .pak), [.testMake()])<br />        .success(RemittanceAPI.stub_beneficiaryFields_bankOfPakistan(), .testMakeNewBank())<br />        .success(RemittanceAPI.stub_beneficiaryRequest(), .valid(.testMake()))<br />    // New loan<br />        .success(RemittanceAPI.stub_quote(), .testMake())<br />        .success(RemittanceAPI.stub_submitRemittance(), .testMake())<br />        .build()<br />})<br />func newBeneficiary_newBank_shouldRouteToQuoteScreen() async throws {<br />    sut.start()<br />    <br />    try viewModel(route: \\.beneficiarySelection).createNewUser()<br />    try await viewModel(route: \\.countries).selectPakistan()<br />    try await viewModel(route: \\.providers).selectNew()<br />    try await viewModel(route: \\.userDetails).process(addBankDetails: true)<br />    try await viewModel(route: \\.remittance).process(amount: 200, source: .from)<br />    <br />    let transactionVM = try #require(sut.showTransactionPopover)<br />    try await transactionVM.process()<br />}{}<br />    </code><br /></pre>", "date_published": "2025-09-02T14:59:03+00:00"}, {"id": "https://t.me/c/1240749873/974", "url": "https://t.me/c/1240749873/974", "title": "Больше всего мне помогают функции типо таких, когда надо взять текущую задачу и дождаться ее результ", "content_html": "Больше всего мне помогают функции типо таких, когда надо взять текущую задачу и дождаться ее результата, от чего тест становится линейным. <br /><br /><pre><br />    <code class='language-swift'><br />        <br />func waitQuote() async throws {<br /> try await #require(quoteTask).value<br />}<br />{}<br />    </code><br /></pre><br /><br />Тест может показаться длинным, но он повторяет довольно большой сценарий ввода данных, а его половина это генерируемый снепшот запросов к бэку — так я убедился, что не отправляю случайно больше запросов чем положено. Снепшот мне писать не нужено, Xcode его сам генерит.", "date_published": "2025-09-02T14:58:52+00:00"}], "icon": "https://tg.davvie.com/static/avatars/RubanovMobile.jpg"}