Forwarded from Нейроканал
Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты…
Вспомните последний раз, когда ИИ сделал для вас рабочий результат: код, тесты, документацию или требования. Как вы его проверяли?
Anonymous Poll
16%
Внимательно разобрал сам
36%
Проверил на практике: тесты, запуск, реальные данные
27%
И разобрал, и проверил на практике
1%
Отдал на ревью коллеге
12%
Не проверял, сразу использовал
5%
Не было такого случая или не помню
3%
Другое (напишу в комментариях)
🤝2
Почему LLDB показывает объект, но спотыкается о его свойство
На брейкпоинте p myObj работает, а p myObj.myComputedProperty требует больше времени или упирается в импорт модуля. Эти команды проходят разными путями: значение переменной можно прочитать по отладочной информации и reflection metadata, вычисляемое свойство требует выполнения кода.
В разборе команды Swift объясняется, зачем встроенному в LLDB компилятору нужен точный модуль. Одного имени недостаточно: у модуля могут быть разные варианты для платформ или разные наборы деклараций.
Изменения в Swift 6.3–6.4 позволяют хранить точные пути к явно собранным модулям и их зависимостям. Xcode и SwiftPM передают нужные данные автоматически. Собственным системам сборки, которые напрямую вызывают Swift frontend, может понадобиться настройка debug-module-path.
На брейкпоинте p myObj работает, а p myObj.myComputedProperty требует больше времени или упирается в импорт модуля. Эти команды проходят разными путями: значение переменной можно прочитать по отладочной информации и reflection metadata, вычисляемое свойство требует выполнения кода.
В разборе команды Swift объясняется, зачем встроенному в LLDB компилятору нужен точный модуль. Одного имени недостаточно: у модуля могут быть разные варианты для платформ или разные наборы деклараций.
Изменения в Swift 6.3–6.4 позволяют хранить точные пути к явно собранным модулям и их зависимостям. Xcode и SwiftPM передают нужные данные автоматически. Собственным системам сборки, которые напрямую вызывают Swift frontend, может понадобиться настройка debug-module-path.
👍1🔥1
Android-приложение в окне: что проверить кроме ширины
Пользователь сужает окно, открывает рядом второй документ и переключается на клавиатуру. Интерфейс, который просто растянули со смартфона, быстро показывает свои ограничения.
В руководстве Google по адаптации для Googlebook предлагается строить раскладку по доступному пространству окна через window size classes. Список и детали могут стоять рядом в широком окне и переходить к последовательной навигации в узком.
Отдельно стоит проверить фокус и клавиатурную навигацию, правый клик, hover, drag and drop и независимые экземпляры приложения. Desktop-эмулятор в Android Studio Canary позволяет прогнать изменение размеров окна и работу мыши, трекпада и клавиатуры прямо на рабочей машине.
Пользователь сужает окно, открывает рядом второй документ и переключается на клавиатуру. Интерфейс, который просто растянули со смартфона, быстро показывает свои ограничения.
В руководстве Google по адаптации для Googlebook предлагается строить раскладку по доступному пространству окна через window size classes. Список и детали могут стоять рядом в широком окне и переходить к последовательной навигации в узком.
Отдельно стоит проверить фокус и клавиатурную навигацию, правый клик, hover, drag and drop и независимые экземпляры приложения. Desktop-эмулятор в Android Studio Canary позволяет прогнать изменение размеров окна и работу мыши, трекпада и клавиатуры прямо на рабочей машине.
👌1
Когда кнопки SwiftUI переезжают на край экрана
На iPhone Duo действия, навигация и вкладки могут оказаться в общей вертикальной панели. Для стандартных кнопок адаптация автоматическая, а пользовательским подписям и сложным контролам иногда нужна настройка.
В разборе Natalia Panferova показаны API iOS 27.1: axisBehavior задаёт предпочтительное размещение элемента, а toolbarVerticalEdge помогает перестроить его содержимое под выбранный край экрана.
При нехватке места toolbarVerticalCompressionBehavior позволяет выбрать приоритет: сохранить вкладки и убрать часть действий в overflow или оставить действия, свернув вкладки. Для конкретного окна или sheet вертикальную панель можно отключить через toolbarVerticalBehavior(.disabled).
На iPhone Duo действия, навигация и вкладки могут оказаться в общей вертикальной панели. Для стандартных кнопок адаптация автоматическая, а пользовательским подписям и сложным контролам иногда нужна настройка.
В разборе Natalia Panferova показаны API iOS 27.1: axisBehavior задаёт предпочтительное размещение элемента, а toolbarVerticalEdge помогает перестроить его содержимое под выбранный край экрана.
При нехватке места toolbarVerticalCompressionBehavior позволяет выбрать приоритет: сохранить вкладки и убрать часть действий в overflow или оставить действия, свернув вкладки. Для конкретного окна или sheet вертикальную панель можно отключить через toolbarVerticalBehavior(.disabled).
👌2❤1
Почему SwiftUI не видит Map без второго import
В представлении есть
В разборе cross-import overlays показано, что при совместном импорте SwiftUI и MapKit компилятор подключает дополнительный модуль
Так устроены и другие интеграции: для
Если знакомого типа нет ни в области видимости, ни в автодополнении, проверьте пару фреймворков, которые он связывает. В SDK правила таких подключений можно найти в каталогах
В представлении есть
import SwiftUI, но компилятор не находит Map. Тип действительно существует — просто одного импорта для него недостаточно.В разборе cross-import overlays показано, что при совместном импорте SwiftUI и MapKit компилятор подключает дополнительный модуль
_MapKit_SwiftUI. Именно там находится представление Map. Импортировать этот внутренний модуль вручную не нужно.Так устроены и другие интеграции: для
PhotosPicker нужен PhotosUI, для WebView — WebKit, для VideoPlayer — AVKit вместе со SwiftUI.Если знакомого типа нет ни в области видимости, ни в автодополнении, проверьте пару фреймворков, которые он связывает. В SDK правила таких подключений можно найти в каталогах
.swiftcrossimport и файлах .swiftoverlay.👌1
KMP-проект с Kotlin Toolchain 0.13: меньше ручной настройки
JetBrains теперь рекомендует Kotlin Toolchain для большинства новых KMP-проектов. Версия 0.13 объединяет создание проекта, настройку окружения, сборку и запуск через CLI.
В разборе обновления команда показывает
Появился импорт SwiftPM-зависимостей через их Objective-C API. А кеши Kotlin/Native позволяют повторно использовать собранные зависимости и пересобирать затронутые файлы в поддерживаемых отладочных конфигурациях.
Для существующих Gradle-проектов это пока не рекомендация к массовой миграции: JetBrains продолжает закрывать пробелы в их поддержке.
JetBrains теперь рекомендует Kotlin Toolchain для большинства новых KMP-проектов. Версия 0.13 объединяет создание проекта, настройку окружения, сборку и запуск через CLI.
В разборе обновления команда показывает
kotlin new: мастер предлагает выбрать тип приложения и целевые платформы. Недостающие компоненты Android SDK устанавливаются и при импорте проекта в IDE. Для iOS улучшили диагностику Xcode и автоматическую подготовку симулятора.Появился импорт SwiftPM-зависимостей через их Objective-C API. А кеши Kotlin/Native позволяют повторно использовать собранные зависимости и пересобирать затронутые файлы в поддерживаемых отладочных конфигурациях.
Для существующих Gradle-проектов это пока не рекомендация к массовой миграции: JetBrains продолжает закрывать пробелы в их поддержке.
👍1
Как передать ИИ-агенту результаты Xcode Instruments
Файл
В разборе RocketTrace автор показывает другой порядок: приложение анализирует запись локально, ранжирует найденные проблемы и передаёт агенту краткую сводку с доказательствами. Затем можно запросить детали конкретной находки.
Для замера рекомендуют свежую сборку в release-конфигурации: отладочная может показать затраты, которых не будет у пользователей. После исправления добавляют новый прогон и сравнивают результаты.
В авторском бенчмарке агенты находили больше проблем с меньшими затратами токенов. Это эксперимент на одной подготовленной записи; результат своего приложения нужно измерять отдельно.
Файл
.trace содержит множество таблиц: CPU, зависания, задачи Swift, обновления SwiftUI. Если агент экспортирует их подряд, большая часть работы уходит на чтение и фильтрацию данных.В разборе RocketTrace автор показывает другой порядок: приложение анализирует запись локально, ранжирует найденные проблемы и передаёт агенту краткую сводку с доказательствами. Затем можно запросить детали конкретной находки.
Для замера рекомендуют свежую сборку в release-конфигурации: отладочная может показать затраты, которых не будет у пользователей. После исправления добавляют новый прогон и сравнивают результаты.
В авторском бенчмарке агенты находили больше проблем с меньшими затратами токенов. Это эксперимент на одной подготовленной записи; результат своего приложения нужно измерять отдельно.
👍2🔥1
Пользователь отменил покупку. Это ещё не ошибка
Собственный экран оплаты и собственная обработка транзакции — два отдельных решения. Можно нарисовать paywall самостоятельно, а завершение покупки оставить SDK RevenueCat.
В руководстве по Android-покупкам разобраны
Для перехода между тарифами важен режим замены. Например,
Когда транзакцию завершает само приложение, на нём остаётся и обязанность подтвердить покупку. Кастомизация интерфейса сама по себе такой обязанности не добавляет.
Собственный экран оплаты и собственная обработка транзакции — два отдельных решения. Можно нарисовать paywall самостоятельно, а завершение покупки оставить SDK RevenueCat.
В руководстве по Android-покупкам разобраны
PurchaseParams, обработчики результата и режимы смены подписки. У отмены пользователем есть отдельный признак: закрытие окна Google Play не стоит превращать в сообщение «Покупка не удалась».Для перехода между тарифами важен режим замены. Например,
WITHOUT_PRORATION может включить новый план сразу, но не списать доплату до окончания текущего периода. Если бизнес-логика ожидает другое, настройку нужно задать явно.Когда транзакцию завершает само приложение, на нём остаётся и обязанность подтвердить покупку. Кастомизация интерфейса сама по себе такой обязанности не добавляет.
❤1🤝1
Как согласовать скругления карточки и контейнера в SwiftUI
Одинаковый
В примере с GeometryReader эти радиусы передают в
Есть ограничение: радиус не превышает половины короткой стороны карточки. Поэтому маленькое представление вплотную к углу экрана может всё равно обрезаться — одного вычисленного скругления недостаточно, нужно проверить отступ.
Свойство возвращает optional: пример использует нулевые радиусы при
Одинаковый
cornerRadius у внешнего контейнера и вложенной карточки не даёт концентрических углов: между ними есть отступ. В iOS 27 значения можно получить через GeometryProxy.concentricCornerRadii.В примере с GeometryReader эти радиусы передают в
UnevenRoundedRectangle. По умолчанию расчёт ориентируется на углы экрана. Чтобы учитывать собственный контейнер, его форму задают через containerShape.Есть ограничение: радиус не превышает половины короткой стороны карточки. Поэтому маленькое представление вплотную к углу экрана может всё равно обрезаться — одного вычисленного скругления недостаточно, нужно проверить отступ.
Свойство возвращает optional: пример использует нулевые радиусы при
nil. Для произвольного прямоугольника есть concentricCornerRadii(in:), которому передают рамку в координатах GeometryProxy.👍1
Долгая задача продолжится, даже если Android-приложение закрыли
Помощник собирает маршрут: ищет перелёт, гостиницу и билеты. Если весь процесс привязан к экрану телефона, уход приложения в фон усложняет сохранение прогресса.
В разборе архитектуры Jetpacker Google переносит многошаговый сценарий на сервер. Координатор ADK вызывает специализированных агентов, а Android-клиент показывает ход работы и запрашивает выбор пользователя.
AG-UI передаёт сообщения и события выполнения. A2UI описывает интерфейс структурированными данными, которые клиент отображает нативными компонентами Jetpack Compose.
Так сервер может менять сочетания поддерживаемых карточек без выпуска новой версии приложения. Но набор компонентов всё равно задаётся на клиенте: произвольный экран, которого бинарник не умеет рисовать, из JSON не появится. В статье есть ссылки на код сервера и Android-приложения.
Помощник собирает маршрут: ищет перелёт, гостиницу и билеты. Если весь процесс привязан к экрану телефона, уход приложения в фон усложняет сохранение прогресса.
В разборе архитектуры Jetpacker Google переносит многошаговый сценарий на сервер. Координатор ADK вызывает специализированных агентов, а Android-клиент показывает ход работы и запрашивает выбор пользователя.
AG-UI передаёт сообщения и события выполнения. A2UI описывает интерфейс структурированными данными, которые клиент отображает нативными компонентами Jetpack Compose.
Так сервер может менять сочетания поддерживаемых карточек без выпуска новой версии приложения. Но набор компонентов всё равно задаётся на клиенте: произвольный экран, которого бинарник не умеет рисовать, из JSON не появится. В статье есть ссылки на код сервера и Android-приложения.
👍1
Границы модулей, которые нельзя обойти случайным import
Фича оформления заказа захотела аватар пользователя — и получила зависимость от реализации профиля. Проект собирается, но менять эти части независимо уже сложнее.
В разборе модульной архитектуры Compose каждую возможность делят на
Правило проверяет convention plugin Gradle: зависимость чужой фичи от
Для навигации наружу отдают launcher, возвращающий маршрут. Фича знает, куда можно перейти, а вызывающий код решает, как изменить back stack. В статье есть примеры проверок и цена такого разделения.
Фича оформления заказа захотела аватар пользователя — и получила зависимость от реализации профиля. Проект собирается, но менять эти части независимо уже сложнее.
В разборе модульной архитектуры Compose каждую возможность делят на
-api и -impl. Только модуль приложения видит реализации. Остальные фичи общаются через контракты.Правило проверяет convention plugin Gradle: зависимость чужой фичи от
-impl останавливает сборку ещё на этапе конфигурации. Внутренние маршруты, репозитории и ViewModel дополнительно закрывают через Kotlin internal.Для навигации наружу отдают launcher, возвращающий маршрут. Фича знает, куда можно перейти, а вызывающий код решает, как изменить back stack. В статье есть примеры проверок и цена такого разделения.
👌1
Кнопка закрытия sheet переехала на боковую панель
На внешнем экране iPhone Duo привычное модальное окно может получить вертикальный toolbar. На внутреннем — остаться с горизонтальным, а при сгибании сдвинуться в сторону.
В примере SwiftUI sheets это происходит автоматически при сборке с iOS 27.1 SDK. Следить за углом шарнира и вручную двигать окно для стандартного поведения не нужно.
Размещение можно уточнить через
Это обход проблемы конкретной беты. Перед добавлением собственных отступов стоит проверить стандартное окно в симуляторе во всех положениях устройства.
На внешнем экране iPhone Duo привычное модальное окно может получить вертикальный toolbar. На внутреннем — остаться с горизонтальным, а при сгибании сдвинуться в сторону.
В примере SwiftUI sheets это происходит автоматически при сборке с iOS 27.1 SDK. Следить за углом шарнира и вручную двигать окно для стандартного поведения не нужно.
Размещение можно уточнить через
presentationPlacement. Но автор нашла нюанс в iOS 27.1 beta: у окна с положением trailing кнопка закрытия иногда перекрывалась системной областью. В её тесте помогло явное presentationDetents([.large]).Это обход проблемы конкретной беты. Перед добавлением собственных отступов стоит проверить стандартное окно в симуляторе во всех положениях устройства.
💯1
Два String — и платёж ушёл не туда
Идентификаторы продавца и банка могут выглядеть одинаково. Если оба представлены строками, перепутанные аргументы спокойно проходят компиляцию.
В разборе опыта Verifone для каждого понятия вводят свой Kotlin value class:
Та же логика распространяется на состояние операции. Обязательное поле не делают nullable «на всякий случай», а разные исходы описывают sealed-типами. Таймаут запроса сам по себе не доказывает, что платёж не состоялся.
Эти приёмы пригодятся и в мобильном клиенте: на границе API сырые данные проверяют и превращают в типы предметной области, с которыми дальше работает приложение.
Идентификаторы продавца и банка могут выглядеть одинаково. Если оба представлены строками, перепутанные аргументы спокойно проходят компиляцию.
В разборе опыта Verifone для каждого понятия вводят свой Kotlin value class:
MerchantId, AcquirerId и другие. После этого подмена одного идентификатора другим становится ошибкой типов.Та же логика распространяется на состояние операции. Обязательное поле не делают nullable «на всякий случай», а разные исходы описывают sealed-типами. Таймаут запроса сам по себе не доказывает, что платёж не состоялся.
Эти приёмы пригодятся и в мобильном клиенте: на границе API сырые данные проверяют и превращают в типы предметной области, с которыми дальше работает приложение.
🔥1
Lottie в пейволле: обычный пример с CDN не заработает
В RevenueCat можно добавить собственную анимацию в серверный пейволл. Но custom component загружается как самостоятельный набор веб-файлов со строгими ограничениями.
В руководстве для Android показаны варианты с Rive и Lottie. Скрипты, стили, runtime и данные анимации упаковывают вместе. Запросы через
У Rive это влияет даже на выбор сборки: стандартный runtime подтягивает WebAssembly, поэтому в примере используют
В таком компоненте размещают декоративную часть. Выбор тарифа и кнопки покупки остаются нативными — обработкой покупки по-прежнему занимается SDK.
В RevenueCat можно добавить собственную анимацию в серверный пейволл. Но custom component загружается как самостоятельный набор веб-файлов со строгими ограничениями.
В руководстве для Android показаны варианты с Rive и Lottie. Скрипты, стили, runtime и данные анимации упаковывают вместе. Запросы через
fetch, inline-скрипты и eval запрещены политикой CSP.У Rive это влияет даже на выбор сборки: стандартный runtime подтягивает WebAssembly, поэтому в примере используют
canvas-single. Данные анимации передают напрямую, без загрузки по URL.В таком компоненте размещают декоративную часть. Выбор тарифа и кнопки покупки остаются нативными — обработкой покупки по-прежнему занимается SDK.
🤝1
Отдельные ToolbarItem ещё не означают отдельные кнопки
В iOS 26 соседние элементы SwiftUI toolbar могут объединяться в одну стеклянную капсулу. Разнести их по нескольким
В разборе группировки toolbar показано, что важны соседство и край панели. Текст, иконки и пользовательские представления могут получить общий фон.
Чтобы разделить действия явно, между ними ставят
Отдельная ловушка — кнопка подтверждения. Одного placement
В iOS 26 соседние элементы SwiftUI toolbar могут объединяться в одну стеклянную капсулу. Разнести их по нескольким
ToolbarItemGroup недостаточно.В разборе группировки toolbar показано, что важны соседство и край панели. Текст, иконки и пользовательские представления могут получить общий фон.
Чтобы разделить действия явно, между ними ставят
ToolbarSpacer. Фиксированный создаёт небольшой промежуток. Гибкий в нижней панели раздвигает группы к краям, но в верхней не получает пространство заголовка.Отдельная ловушка — кнопка подтверждения. Одного placement
confirmationAction недостаточно для собственной капсулы: в примере её выделяет роль confirm. Это стоит проверить, если «Готово» визуально слилось с соседним действием.👏1
Kotlin давно вышел за пределы Android. Вот что показывает опрос
Больше половины Kotlin-разработчиков в исследовании JetBrains сообщили, что работают над backend-проектами. Это полезный контекст для мобильных команд, которые обсуждают общий язык с серверной частью.
В State of Kotlin 2026 собраны данные исследований JetBrains, отраслевые сведения и примеры использования языка. Отдельные разделы посвящены multiplatform и AI-инструментам.
Среди опрошенных Kotlin-разработчиков 93% используют хотя бы один AI coding tool. А 81% оценивают сгенерированный Kotlin-код как полностью корректный или требующий небольших исправлений.
Последнее число описывает ответы людей, а не результат независимого тестирования кода. Отчёт помогает увидеть практики сообщества; решение о KMP или генерации кода для своего приложения всё равно требует отдельной проверки.
Больше половины Kotlin-разработчиков в исследовании JetBrains сообщили, что работают над backend-проектами. Это полезный контекст для мобильных команд, которые обсуждают общий язык с серверной частью.
В State of Kotlin 2026 собраны данные исследований JetBrains, отраслевые сведения и примеры использования языка. Отдельные разделы посвящены multiplatform и AI-инструментам.
Среди опрошенных Kotlin-разработчиков 93% используют хотя бы один AI coding tool. А 81% оценивают сгенерированный Kotlin-код как полностью корректный или требующий небольших исправлений.
Последнее число описывает ответы людей, а не результат независимого тестирования кода. Отчёт помогает увидеть практики сообщества; решение о KMP или генерации кода для своего приложения всё равно требует отдельной проверки.
❤2👎2🎉1