Prefire iOS
979 subscribers
101 photos
7 videos
103 links
Чат/блог о современной 🍏iOS разработке

Пробустить канал → https://t.me/prefire_ios?boost

Автор: @barredewe
Download Telegram
🧭 Погружаемся в iOS вместе с Podlodka iOS Crew

Работа с iOS — это не только про красивый фронтенд. С 13 по 17 апреля пройдет новый сезон Podlodka iOS Crew — «Фундаментальный iOS».

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

💡Участники конференции:


• погрузятся в детали Swift Generics и Swift Dictionary,

• узнают, как создать свою ферму виртуальных iPhone с настоящей iOS,

• разберут актуальные подходы работы с Metal
и Core Image,

• погрузятся в то, как внедрить современные мультимодальные LLM в приложения для iPhone, используя аппаратные возможности устройств,

• пройдут по процессу собеседования вместе с тимлидом платформенной команды (это я 👉).

Всё это — в формате утренних и вечерних Zoom-сессий и общения с коллегами в закрытой группе Telegram.

🧠Если вы хотите обновить свои знания о фундаментальных основах iOS и погрузиться в практику вместе с опытными экспертами, подключайтесь к Podlodka iOS Crew👇

🔗 Посмотреть программу и присоединиться

А промокод ios_crew_17_o35WAv дает скидку 500р🎁
Please open Telegram to view this post
VIEW IN TELEGRAM
😎5🔥3👍21
🚬 Розыгрыш 4 промокодов на Podlodka iOS Crew

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

Результаты будут 10 апреля в 18:00 🎁

Сам Crew пройдет с 13 по 17 апреля, тема сезона — «Фундаментальный iOS». Там будет прям глубокое погружение в системные штуки.
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤3🔥3
14 апреля покажу, как можно пройти собеседование по системному дизайну.
Или как его завалить.

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

Я к этому заранее подготовил скилы и агентов, так что самому уже интересно, что из этого получится 💥

14 апреля 17:00 подключайтесь посмотреть и пообщаться вживую:
📹 YouTube: https://www.youtube.com/watch?v=-ZyVpAzCf2E
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤6👍2🤡21
Пока только прошло WWDC (мне кстати не понравилось), разбавлю немного постом про инструменты , которыми пользуюсь.


Недавно открыл для себя довольно новый терминал для macOS - CMUX.

Неожиданно зашло 😁

Самое полезное для меня это сплиты. Очень удобно делить окно и держать рядом несколько сессий opencode (или других *code-агентов).

Когда параллельно работаешь над несколькими задачами (а даже скорее проектами), фича топ.

Еще понравились уведомления. Можно переключиться на другую задачу и не сидеть, уставившись в терминал в ожидании ответа агента. CMUX уведомляет если агенту что то нужно или он завершил работу.

В итоге настолько привык к нему, что полностью переехал со стандартного терминала macOS.

Не скажу, что это какой-то революционный инструмент. Но если активно используете opencode, Codex, Claude Code, Gemini CLI или другие агентные инструменты, то CMUX именно под такой сценарий работы (да и для других тоже норм).

CMUX на GitHub⁠
👍9🔥3❤‍🔥1
🐈 Решил заняться своим старым проектом «ScreenCat».

Вот, например, старый пост: https://t.me/prefire_ios/116

Обновил llama.cpp, полностью ушел от LLM.swift к самописному (ага, конечно, навайбкоденному 😁) бриджу на Swift со всеми новыми фишками, типа спекулятивного выполнения и так далее.

Но это не главное. У кота сейчас модель довольно большая - Qwen 3.5 2B или 4B на выбор. Это нагружает компьютер.

Вот решил выбрать модель поменьше, MiniCPM 1B, и дообучить её через LoRA под конкретную задачу. В этом помогла как раз ИИшка.

Из этапов, без большого погружения, выглядит так:

1. Сначала качаем модель.
2. Потом нужно найти или сгенерировать датасет. Так как мне нужны фразы котика, такого датасета я не нашел. Так что с помощью другой модели (Qwen 3.6 35B) начал генерацию. Если интересно, что и как, могу сделать отдельный пост.
3. Дальше с помощью датасета и самой маленькой модели обучаем её. Одна команда в терминале, сам удивлен, что так легко.
4. Наслаждаемся результатом 😁

На самом деле результат очень плохой 🤡

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

Буду рад послушать предложения и исправления.
❤12🔥22
Обновления в 🔥Prefire

Prefire, если кто-то вдруг пропустил, это мой инструмент для SwiftUI/UIKit #Preview.

Он берет превьюхи и на их основе генерирует snapshot-тесты и Playbook.

Из свежего я добавил установку через Mint:
mint install BarredEwe/Prefire


Теперь Prefire можно ставить через Brew, SPM, Xcode Plugin и Mint.

А еще за последнее время в проект прилетело очень много крутых доработок контрибьютов ❤️

Например, добавили split_snapshot_directories.
Это флаг, который раскладывает снапшоты по папкам исходных файлов. Когда превьюх много, это сильно удобнее, чем одна огромная папка со всем подряд.

Плюс поправили несколько неприятных кейсов:
- исправлена проблема с определением пути к yml конфигу;
- @Previewable;
- креш, если после #Preview идет перенос строки;
- настройку drawHierarchy.

И я думаю, сейчас Prefire стал еще актуальнее.
UI все чаще пишется с помощью ИИ. Агент может быстро накидать экран, поменять компоненты, поправить состояние. Но после этого все равно нужен какой-то быстрый способ понять: он визуально ничего не развалил?

(Надо продумать этот кейс подробнее, может mcp сделать)

Snapshot-тесты из #Preview как раз хорошо закрывают этот сценарий.

GitHub:
https://github.com/BarredEwe/Prefire

Буду рад звездам, ишьюсам и особенно фидбеку от тех, кто попробует у себя.
🔥21❤6👍41
Хочу рассказать одну довольно личную историю 💀

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

Все получилось. Команда выросла до 30+ человек.

Я не только писал код, но и много вкладывался в людей. Собеседовал, нанимал, старался продвигать ребят: конференции, обучение, open source и все такое. Было очень приятно видеть, как люди растут.

Но дальше пошла череда неудач.

Постепенно у меня забирали команды, которые я сам собирал. В итоге спустя пару лет я вообще остался без команды и стал индивидуальным контрибьютором (экспертом).

Я очень тяжело это пережил.

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

Потом в какой-то момент решил, что так дальше нельзя.

Начал заниматься спортом.

Сначала просто хотелось снова нормально себя чувствовать. Потом втянулся. Постепенно похудел, подкачался, вернулась энергия. А уже после этого нашел новую классную работу.

Наверное, это довольно стандартная история в IT. Да и не только в IT.

Но для себя я вынес один очень важный инсайд:
здоровье > любой работы

Никакой проект, должность или зарплата не стоят того, чтобы настолько забивать на себя.

Работу можно поменять. А здоровье вернуть намного сложнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
3❤67💯21👍15🔥101
Кажется, Prefire полюбили в Японии 🇯🇵

Только вернулся из отпуска в Японии и, пока был там, случайно наткнулся на статью японской компании PREVENT не спрашивайте что это за компания, сам не знаю.

Они подробно рассказали, как используют Prefire в продакшн-разработке для snapshot-тестов. Ой как приятно 🥹

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

Из интересных моментов: ребята из PREVENT фиксируют Locale и другие параметры окружения, чтобы уменьшить количество флаков. А при падении CI сохраняют весь .xcresult, чтобы потом удобно разбирать проблему локально. Честно говоря, про такой подход я сам даже не думал 😄

И это, как оказалось, не единичный случай. Уже после статьи начал копать дальше и выяснил, что в Японии было несколько конференций, митапов и статей, где обсуждали Prefire и работу с ним. Вообще не ожидал, что именно там вокруг проекта будет такая активность.

В целом мега приятно такое находить. Очень мотивирует продолжать развивать проект. Прямо сейчас заканчиваю поддержку macOS - PR уже открыт 🚀
2❤29🔥22👍71
Сделал систему скинов для котиков 🐈

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

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

В итоге собрал data-driven систему на JSON. Теперь визуальная часть кота состоит из трёх уровней:

1. skin.json - описание конкретного кота: его части, текстуры, позиции, порядок слоёв, точки крепления аксессуаров и настройки взгляда.

2. JSON-клипы анимаций - описывают движение частей: подпрыгивание тела, поворот хвоста, наклон головы, моргание.

3. animations.json — граф состояний: когда кот сидит, бежит, спит, реагирует на действие или переключается между анимациями.

{
"id": "ginger_fold_cat",
"rig": {
"parts": [
{ "id": "body", "texture": "body.png", "position": [-5, -22] },
{ "id": "tail", "texture": "tail.png", "parent": "body", "position": [32, -12] },
{ "id": "head", "texture": "head.png", "parent": "body", "position": [-10, 41] }
]
}
}


Риг это иерархия частей внутри скина. Например, хвост прикреплён к телу, а глаза к голове. Поэтому при движении головы всё нужное едет вместе с ней.

Анимации задаются не абсолютными координатами, а дельтами от базовой позы. Один и тот же клип бега можно применить к разным котам, даже если у них разная форма тела или хвоста:

{
"part": "tail",
"property": "rotation",
"keys": [[0, 0], [0.14, 18], [0.42, -18], [0.56, 0]]
}



То есть здесь хвост просто отклоняется от своего обычного положения на 18 градусов туда и обратно. Клипу не нужно знать, где хвост находится у конкретного скина.

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

PS: После написания json - скрипт прогоняет рендеринг PNG через ffmpeg

А дальше я навайбкодил UI на Tauri, чтобы работать со скинами было ещё удобнее.
Про редактор, генерацию арта и весь этот пайплайн расскажу в следующих постах.
🔥14❤44
This media is not supported in your browser
VIEW IN TELEGRAM
Начал готовить к релизу ScreenCat - 🐈 Mewmori

- Переименовал проект в Mewmori (типо memory - память, но измененное под мяу)
- Cделал большой редизайн и кучу внутренних оптимизаций, что бы кот не кушал всю батарею и ресурсы на mac. Потестил даже на Mac M1 - работает отлично.
- Сейчас активно готовлю контент для соц. сетей. И даже некоторый уже выложил.

В целом, проект именно по добавлению фич - заморозил. Он уже очень сильно разросся и вышел за пределы котика (ассистент, игры и тд). Это мне позволило переключиться именно на продвижение)

А сверху видео для рилса, которое я сделал полностью кодом:
1. Написал промо сценарий
2. Cделал фейковый рабочий стол
3. На питоне сделал запись экрана и подстановку музыки

Теперь клипаю ролики спокойно, написав один простой json с сценарием этого ролика 😊
  "name": "intro-ru",
  "settle": 1.0,
  "tail": 1.0,
  "steps": [
    { "action": "move", "x": 0.47, "y": 0.20, "style": "teleport" },
    { "action": "look", "skin": "classic_cat" },
    { "action": "mood", "value": "sleeping" },
    { "action": "wait", "seconds": 1.6 },

    { "action": "mood", "value": "interacting", "direction": "right" },
    { "action": "effect", "value": "surprise" },
    { "action": "say", "text": "Ой. Ты меня видишь?", "hold": 2.0 },

    { "action": "say", "text": "Я Mewmori. Живу у тебя на рабочем столе.", "hold": 3.2 },
  ]
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥115❤2
Нахождение текста котом Mewmori в уникальных приложениях

Что бы кот видел, я снимаю скриншот активного приложения. После перегоняю скриншот в текст через VIsion. И вот после этого идет довольно много работы, перед тем как ИИ мозг кота получит текст и понимание.

Сейчас кот перед тем как передать контекст в ИИ, немного его причесывает.

Что получаем после обычного Vision OCR (определение текста по скриншоту):

Telegram
Антон
был недавно
Маша
А ты сегодня будешь?
Да, ближе к вечеру
Работа
Prefire
12:43
12:45


По сути просто набор строк с координатами. Для маленькой модели это выглядит очень сложно и она не может связать хоть что-то по смыслу. Для этого нужен процессинг. Сам процессинг максимально простой, весь текст делится линиями, который вычисляются на основе x/y координат текста. И эти линии говорят нам о том, где примерно заголовок и тд.

А Вот что в итоге передаем в модель:

Приложение: Telegram
Чат: Антон
Статус: был недавно
Сообщения:
Антон: А ты сегодня будешь?
Я: Да, ближе к вечеру


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

А есть специфичные. Например, для Telegram я ищу самый большой разрыв по X между распознанными строками. Так можно довольно неплохо понять, где заканчивается список чатов и начинается сам чат.

И после процессинга кот уже начинает забавно шутить. Он может не просто сказать что-то про текущий диалог, а запомнить, что я уже общался с этим человеком. А через какое-то время спросить что-нибудь типа: «Вы давно дружите?» 😼

Пока всё это набор эвристик под конкретные приложения. Но мне прям нравится, насколько сильно такая простая предобработка меняет ощущение от маленькой локальной 2B модели.
👍7🔥511
Кажется, мой кот начал жить своей жизнью.

Сначала друзья просто закинули Mewmori в несколько больших Telegram-пабликов. Я тогда сидел и смотрел, как внезапно растут скачивания, DAU и онбординг.

Потом про кота отдельно написал AppleInsider (кстати классный обзор вышел).

А теперь он добрался до RationalAnswer, где Mewmori уже обсуждают как «нейрокотана».

И вот это, если честно, для меня сейчас самое странное ощущение от проекта. Когда ты долго что-то делаешь сам, ты очень хорошо знаешь все кривые места:
• Где костыль.
• Где окно иногда не открывается.
• Где OCR можно сделать лучше.
• Где кот говорит какую-то ерунду.

А потом люди снаружи начинают воспринимать это уже просто как готовую штуку. Не как очередной эксперимент с локальной LLM. А как: «о, прикольный кот для Mac» или «нейрокотан».

И, кажется, именно в этот момент проект впервые становится не только твоим. Он начинает жить у других людей 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
322🔥9👍4❤2
🧭 Podlodka iOS Crew: разработка с AI

С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В этот раз в центре внимания авторов конференции то, как AI меняет iOS-разработку. Я там буду рассказывать про то, как котик видит экран через AI.

Что ждёт участников:

🍏 Стратегия внедрения терминальных ИИ-агентов и MCP-интеграции в ежедневную iOS-разработку

🍏 AI как экзокостюм мобильного разработчика: harness, skills, CLI, orchestration, validation и evals

🍏 Знания о том, как запускать локальные модели на Apple Silicon

🍏 Готовые скрипты, которые можно забрать в свой проект: шаблон рабочего пространства агента, примеры скиллов и MCP, пайплайн от Jira-задачи до Merge Request.

И это ещё не всё! Подробности о сезоне смотрите на сайте, и там же есть билеты по early-bird цене.

👉 Билеты на Podlodka iOS Crew
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🤬3👍2🗿2❤1👎11
☺️ Prefire в требованиях к вакансиям

Где-то месяц назад поставил ежедневную задачу на ChatGPT. Искать упоминания своих 'поделок': Prefire, Mewmori, Snowfall Desktop и др.

Сегодня увидел неожиданное и приятное 😁

В вакансии Lead QA Engineer в Emirates среди требований к iOS-разработке написано:
• XCUITest, Snapshot testing (Prefire)
• А для Android - Compose Testing и Paparazzi.

Причём сама вакансия ещё июльская. То есть всё это время где-то существовала вакансия в Emirates, где знание моей библиотеки было одним из требований, а я вообще об этом не знал 😅

Первый раз увидел Prefire в таком контексте. Обычно это статьи, доклады, или проекты на github. Но чтобы кто-то искал Lead QA с этим знанием, это что то новое 😁

PS: На изображении к посту - новый котик/лис, которого я добавил в последний релиз mewmori и еще кучу осенней одежды😊
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍8👏63