Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
94 - Telegram Web
Telegram Web
🧠 За милой мордочкой ScreenCat скрывается ИИ-движок.

Я встроил прямо в приложение бинарь Ollama — он запускается локально при первом старте и предлагает скачать модель LLaMA 3.1 8B. Всё оффлайн, всё приватно. Такой модели хватает для умного котика 🙂

Кот работает на системе промптов: я формирую для него описание окружения и текущего состояния — и модель решает, что делать. Например, если он голоден, рядом открыт Xcode, и на экране ошибки — он может подойти и «пожалеть» разработчика.

Инфу кот получает из окна вокруг себя — область 400×400px. Чтобы увидеть остальной экран, ему нужно ходить. Это не абстрактный ИИ — он реально «смотрит» на экран и воспринимает только то, что рядом.

Контент из приложений читаю через Vision, чтобы понять, что именно там происходит: код, сообщения, статьи и т.д. Всё это добавляется в prompt — и кот реагирует.

Скоро покажу примеры того, как он ведёт себя в разных ситуациях.

#screencat #ai
Please open Telegram to view this post
VIEW IN TELEGRAM
🧪 Стек ScreenCat

Вообще стек довольно простой. Старался брать минимум зависимостей для меньшего размера. Опыт с SpriteKit у меня уже был, на самой первой работе. Писал там игру 2D scroll shooter.

🐱 UISwiftUI: меню, баблы, панели. Всё кастомное, даже Shape для кнопок.
🧵 SpriteKit: хвост анимируется шейдерами, глаза моргают, тело дышит — всё процедурно. Сам кот состоит из хвоста, глаз и тела. Маловато конечно для крутых анимаций, но уже выглядит живо.
🧠 Ollama + LLaMA 3: локальная LLM встроена прямо в .app, скачивает модель при первом запуске.
🪟 Vision: кот реально «смотрит» на окна и читает, что на экране.
🧠 PromptBuilder: собирает контекст из нужд кота, окружения и текста с экрана.
🔄 CatEngine — мини-движок сценариев. Есть очередь, прерывания, заморозка и логика приоритетов. На сценариях я пишу вообще все, открытие меню, ходьбу котика, игры с ним и тд. Приложил скриншот как раз с уже готовыми сценариями 😏
🔋 DisplayLink: анимации хождения по экрану + некоторые игры.
💾 UserDefaults + Cache: всё, что кот знает, он помнит. Даже как ты его звал.

#screencat
This media is not supported in your browser
VIEW IN TELEGRAM
🎮 Меню для ScreenCat — в духе Persona 5

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

Технически:
👉 Меню написано на SwiftUI
👉 Каждая кнопка — кастомная Shape с гранями, как в Persona
👉 Кнопки располагаются по кругу, рассчитываются через угол + радиус
👉 При наведении — лёгкая 3D деформация и тень
👉 Есть эффект «разворота», если угол большой — текст поворачивается, чтобы быть читаемым
👉 Под котом появляется фон, подчёркивающий действия

Интересно было балансировать читаемость, кликабельность и стиль. Теперь меню реально ощущается частью персонажа, а не просто интерфейсом.

#screencat
DeepWiki — что за сервис и стоит ли его пробовать?

DeepWiki — это веб-платформа от Cognition AI (релиз 25 апреля 2025 г.)⁠, которая по запросу создаёт wiki-страницу для любого публичного GitHub-репозитория. Достаточно заменить github.com на deepwiki.com в URL, после чего открывается сгенерированное «досье» на проект — со структурой файлов, диаграммой зависимостей и встроенным чат-ассистентом Devin.

Мой опыт использования
Когда я открыл свой репозиторий Prefire в DeepWiki, сервис вывел жирным заголовком фразу “Define Once, Use Everywhere”. Забавно: эта мысль действительно лежала в основе библиотеки — мы описываем UI-превью один раз (через #Preview или PrefireProvider), а дальше они превращаются и в снапшот-тесты, и в живую демку. Но сформулировать это как чёткий принцип я раньше не догадался, а в README он мелькал только намёками.

Было круто посмотреть как мой репозиторий виден со стороны 😏

#ai
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 TL;DR

👋 Привет, ты в Prefire iOS - блоге о живой iOS (и не только) разработке.


⚡️ Архитектура, DI и модульность без святых войн
🛠 CI / CD, кэширование билдов, инструменты перфоманса
🎨 SwiftUI‑сниппеты, анимации и UI‑фишки
🤖 Локальные LLM и AI‑эксперименты в продакшен‑коде
🎙 Опросы + дискуссии по свежему WWDC и релизам Xcode

👉 Добро пожаловать!
Prefire iOS pinned a photo
🗂 Навигация

#blog - Размышления, впечатления, обзоры, новости
#tools - О фреймворках, приложениях и прочих тулзах
#ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд)
#prefire - О Prefire библиотеке.
#screencat — dev‑серия о виртуальном коте для macOS

⭐️ Топ‑3 поста (обновляю раз в месяц)

🎯 Какой iOS‑фреймворк станет номером один? 3 942 просм.
❄️ Создаем зимнее настроение на SwiftUI 1 518 просм.
🗂 Делаем Notion из Obsidian1 437 просм.
Prefire iOS pinned a photo
Prefire iOS pinned «🗂 Навигация #blog - Размышления, впечатления, обзоры, новости #tools - О фреймворках, приложениях и прочих тулзах #ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд) #prefire - О Prefire библиотеке. #screencat — dev‑серия о виртуальном коте…»
Prefire iOS pinned «🗂 Навигация #blog - Размышления, впечатления, обзоры, новости #tools - О фреймворках, приложениях и прочих тулзах #ai - Все об ai в Apple разработке (LLM, MLC, Ollama, LLM.swift и тд) #prefire - О Prefire библиотеке. #screencat — dev‑серия о виртуальном коте…»
Prefire iOS pinned a photo
🎨 Как я рисовал пиксельного кота для своего macOS-приложения

Все майские праздники я провёл за одним — рисовал кота. Хотелось, чтобы у него был характер, настроение, и немного магии 🪄

🐾 Что было сложно
Нарисовать — ещё полдела. Главное — потом правильно разбить его на части:
– хвост должен анимироваться отдельно
– зрачки двигаться в сторону курсора
– и даже поза во сне — отдельный спрайт

🛠 Как я оживил его
Перенёс всё в приложение с помощью своего простого движка анимаций на SpriteKit. Там всё кадрами — как в классике.
Пример кода тоже покажу — вдруг кому-то пригодится!

👇 Вот часть кода с загрузкой спрайтов.
final class CatLayeredView: SKScene {
let body = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_body")
let head = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_head")
let tail = SKSpriteNode(imageNamed: CatMind.shared.currentSkin.imageName + "_tail")
let eyes = EyesNode()

static var defaultScale: CGFloat {
CatConfig.size.width / 1024 * 10
}

private var animator: CatLayeredAnimator!

override func didMove(to view: SKView) {
super.didMove(to: view)
backgroundColor = .clear
anchorPoint = CGPoint(x: 0.5, y: 0.5)

setupLayers()
animator = CatLayeredAnimator(view: self)
animator.setPose(.init())
}

func setPose(_ pose: CatViewAppearance) {
animator.setPose(pose)
}

Дальше расскажу как анимировал кота с помощью небольшого собственного движка 💪

#screencat #spritekit
This media is not supported in your browser
VIEW IN TELEGRAM
🎞 Как я сделал анимации пиксельного кота на macOS (SpriteKit + свой движок)

В этом видео кот дышит, моргает, двигает хвостом, следит за курсором и спит. Всё это работает на базе моего простого и удобного движка анимаций.

🧠 Идея
Каждое настроение кота (сон, бодрствование, наблюдение) — это набор анимационных эффектов, каждый из которых независим и легко настраивается.

🎛 Система сделана так, чтобы было просто управлять поведением и позой.
 case .walking: // Анимации для состояния ходьбы
addEffect(BlinkEffect()) // Моргание глаз
addEffect(EyeWanderEffect()) // Наблюдение за рандомной точкой
addEffect(BreatheEffect()) // Дыхание
addEffect(TailWagEffect()) // Движение хвостом


🧩 Как устроен движок
Каждый эффект реализует простой протокол:

protocol CatAnimationEffect {
func apply(to view: CatLayeredView)
func remove(from view: CatLayeredView)
}


Аниматор подключает нужные эффекты в зависимости от "настроения" кота:

animator.setPose(.sleeping)
// → добавит BreatheEffect, HideEyesEffect, LyingEffect


🎬 Эффекты могут быть какими угодно. Вот, например, как двигается хвост:

final class TailWagEffect: CatAnimationEffect {
func apply(to view: CatLayeredView) {
let wag = SKAction.sequence([
.rotate(byAngle: 0.2, duration: 1.3),
.rotate(byAngle: -0.4, duration: 1.3),
.rotate(byAngle: 0.2, duration: 1.3)
])
view.tail.run(.repeatForever(wag), withKey: "tail_wag")
}

func remove(from view: CatLayeredView) {
view.tail.removeAction(forKey: "tail_wag")
}
}
🎉 Розыгрыш билета на AppsConf 2025!

Хочешь попасть на топовую оффлайн-конференцию для iOS- и Android-разработчиков?
Мы дарим 1 билет на AppsConf 2025, которая пройдёт 4 июня в Москве!

Что будет:
– Сотни мобайл-разработчиков, живое общение и атмосфера большого ивента.
– Я тоже буду на конференции — и веду сразу два круглых стола:
• по AI в разработке
• по плюсам и минусам Open Source

Как участвовать:
1. Подпишись на этот канал.
2. Нажми кнопку «Участвовать» под этим постом.

И всё. Удача может быть на твоей стороне!

🗓 Итоги — 13 мая в 12:00 по МСК. Победителя выберем случайно среди подписчиков.
🚀 Мой путь в мобильной разработке и Open Source

Я поделился на Хабре своей историей о том, как пришёл в мобильную разработку и какие уроки извлёк из участия в Open Source. От первых шагов с хакинтошем до руководства командой в Okko, от создания собственных библиотек до осознания важности оформления проектов и взаимодействия с сообществом.

📖 Читайте полную статью на Хабре: https://habr.com/ru/companies/oleg-bunin/articles/906952/
This media is not supported in your browser
VIEW IN TELEGRAM
🍏 Виджеты в iOS умеют анимации. Но не должны.

Нашёл офигенное видео:
Apple’s Widget Backdoor

Что внутри:
👉 clockHandRotationEffect — приватное API из старых SDK. Позволяет анимировать стрелки в SwiftUI. Да, даже в виджете.

Image(systemName: "clock")
.clockHandRotationEffect(.hours, angle: .degrees(90))


В Xcode 14 это уже выпилили, но можно собрать в Xcode 13 и притянуть как статическую либу.

👉 BlinkingView — вот это настоящая черная магия.
Используется кастомный bitmap-шрифт, где каждый символ — это PNG-кадр.
Виджет показывает Text("A"), потом Text("B"), потом Text("C")…
Каждая буква = кадр анимации. Получается плавная картинка без приватного API, и всё официально.

👉 WidgetAnimation — репозиторий с примером анимированного виджета.
Создаёт 30-секундную зацикленную анимацию в iOS-виджете, используя только публичные API.
Пример работает на 8 FPS, но можно достичь до 30 FPS, используя ту же технику.


Если любишь ломать iOS аккуратно и красиво — must-watch.
App Review пока спит. Но ты не спи.

И вот исходники:
github.com/brycebostwick/WidgetAnimation
2025/06/26 02:12:30
Back to Top
HTML Embed Code: