Тепловая карта из шестиугольников в Swift Charts
Тысячи точек на карте перекрывают друг друга. Если сгруппировать наблюдения по ячейкам и передать их количество цветом, распределение становится проще читать.
В примере Matthaus Woolard Swift Charts отображает землетрясения в Новой Зеландии. Ячейки заданы координатами q/r, а шестиугольники нарисованы через собственный ChartSymbolShape.
Есть полезная деталь: одинаковый размер символов ещё не гарантирует правильные пропорции. Автор настраивает perceptualUnitRect, чтобы соседние ячейки сходились. Затем меняет линейную цветовую шкалу на symmetricLog — слабые различия становятся заметнее, но равные шаги цвета уже не означают равные разницы значений.
Тысячи точек на карте перекрывают друг друга. Если сгруппировать наблюдения по ячейкам и передать их количество цветом, распределение становится проще читать.
В примере Matthaus Woolard Swift Charts отображает землетрясения в Новой Зеландии. Ячейки заданы координатами q/r, а шестиугольники нарисованы через собственный ChartSymbolShape.
Есть полезная деталь: одинаковый размер символов ещё не гарантирует правильные пропорции. Автор настраивает perceptualUnitRect, чтобы соседние ячейки сходились. Затем меняет линейную цветовую шкалу на symmetricLog — слабые различия становятся заметнее, но равные шаги цвета уже не означают равные разницы значений.
👏1
Как Instagram Direct переносил списки на Compose
В Direct сотни типов элементов списка. Переписать их и одновременно заменить RecyclerView — слишком много изменений для одного сравнения производительности.
В кейсе Google и Meta миграцию разделили: сначала переводили элементы на Compose небольшими группами, затем готовили переход на LazyColumn. Одни и те же компоненты работают в обоих контейнерах, а реализация переключается флагом для A/B-тестов.
Команда сравнивает время до первого взаимодействия, полной загрузки и плавность прокрутки на реальных пользователях. Небольшой Compose-компонент внутри старого экрана может давать искажённую картину из-за затрат на взаимодействие двух UI-систем. В статье также разобрано, как новая архитектура повлияла на работу ИИ-агентов с кодом.
В Direct сотни типов элементов списка. Переписать их и одновременно заменить RecyclerView — слишком много изменений для одного сравнения производительности.
В кейсе Google и Meta миграцию разделили: сначала переводили элементы на Compose небольшими группами, затем готовили переход на LazyColumn. Одни и те же компоненты работают в обоих контейнерах, а реализация переключается флагом для A/B-тестов.
Команда сравнивает время до первого взаимодействия, полной загрузки и плавность прокрутки на реальных пользователях. Небольшой Compose-компонент внутри старого экрана может давать искажённую картину из-за затрат на взаимодействие двух UI-систем. В статье также разобрано, как новая архитектура повлияла на работу ИИ-агентов с кодом.
👍2🔥1
Forwarded from Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
Эту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
uvx showboat --helpЭту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
❤1
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