Для чего я написал собственный аудиопроигрыватель
👀 Автор разработал собственный аудиопроигрыватель из-за неудовлетворенности существующими решениями, такими как Apple Music и сторонние приложения, которые не обеспечивали нужного функционала для управления локальной музыкальной библиотекой.
⚙️ Приложение было создано с использованием SwiftUI для упрощения разработки интерфейса и управления данными, а также SQLite для реализации полнотекстового поиска и хранения данных.
⚠️ Приложение включает в себя гибкий поиск по папкам iCloud, управление плейлистами и воспроизведение музыки с возможностью настройки очереди и управления громкостью.
🫠 Существующие приложения часто требуют подписки, имеют ограниченные функции и неудобный интерфейс, что побудило автора создать собственное решение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Unique values in Swift: Removing duplicates from an array
❓ В
➡️
➡️ Если порядок важен, можно создать расширение для массива, которое использует протокол
👀 Выбор между
Swift
нет встроенных методов для удаления дубликатов из массива, поэтому необходимо использовать альтернативные подходы, такие как использование Set
или создание расширения для массива.Set
по умолчанию содержит только уникальные значения и подходит, если порядок элементов не важен. Это более производительный вариант для решения проблемы уникальности.Hashable
для фильтрации дубликатов, обеспечивая линейную временную сложность.Set
и расширением массива зависит от необходимости сохранения порядка элементов: используйте Set
, если порядок не важен, и расширение массива, если он важен.extension Sequence where Iterator.Element: Hashable {
func unique() -> [Iterator.Element] {
var seen: Set<Iterator.Element> = []
return filter { seen.insert($0).inserted }
}
}
print(array.unique()) // prints: [1, 2, 3]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Как мы превратили iPhone в лабораторный микроскоп с AI и BLE: real-world edge-приложение
⚡️ Крутая статья о применении iPhone в медицине. Тут и задачи компьютерного зрения, и оптимизации кода, и работа с AI.
⚙️ Система превращает обычный лабораторный микроскоп в цифровой сканер с автоматической подачей и съемкой, используя iPhone для управления и анализа клеток крови.
💵 Разработка недорогого комплекта автоматизации микроскопа, стоимость которого составляет ~800 $, что значительно дешевле, чем традиционные автоматические системы, стоящие от 10к $.
💡 Используемые технологии включают AI для распознавания клеток, Bluetooth Low Energy для управления моторизованным столиком и мощные процессоры iPhone для обработки изображений в реальном времени.
🔥 Мобильное приложение обрабатывает видеопоток, детектирует и классифицирует клетки, управляет движением предметного столика и отправляет данные на веб-сервер для анализа.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤1
Using AI and Cursor to localize Xcode String Catalogs
❓ Строковые каталоги в
➡️ Для экспорта языка из строкового каталога выберите приложение и используйте меню
💡
➡️ После перевода, импортируйте локализованные файлы обратно в
А вот промпт, используемый автором:
Xcode
позволяют легко локализовать приложения, добавляя новые языки через интерфейс, что упрощает процесс по сравнению с использованием старых файлов .strings
.Product > Export Localizations...
, чтобы сохранить локализации в отдельные папки .xcloc
.Cursor
может быть использован для перевода файлов XLIFF
, где вы можете выбрать конкретный файл и запросить перевод содержимого, что упрощает процесс локализации.Xcode
через Product > Import Localizations...
, чтобы обновить строковой каталог с новыми переводами.А вот промпт, используемый автором:
Translate the selected .xliff file’s body tag to the target-language. For each text, keep the source tag and add a target tag with a state="translated"
attribute and the translation as body. Output the result as plain text.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Meet the Foundation Models framework
WWDC прошел и, как обычно, показали много нового и интересного (нет, особенно ужасен новый дизайн Liquid Glass). Для меня самое интересное – это новые AI инструменты и возможности и тут на самом деле было много интересного.
Apple показали фрейморк Foundation Models для работы с llm on-device в приложениях. Из основного:
- полностью нативная реализация и интеграция со swift'ом. Сама модель адаптирована под работу на Apple процессорах
- модель: 3B квантизованная до 2х бит: создать полноценного чат бота с ней не выйдет, но с задачами суммаризации, генерацией / понимаем текста и другими несложными llm-based задачами она более чем может справится
- есть возможность не промптом, а с помощью макросов управлять и структурировать формат ответа модели. Этот подход назвали "guided generation". Если кратко, то мы описываем энамы и структуры, и говорим, что хотим от модели в таком формате получать ответ и будем его именно так и получать
- появится новый инструмент отладки и тестирования работы с моделью
- самое важное и крутое на мой взгляд: "Tool calling": мы можем "зарегистрировать" функции приложения и сказать модели, что она может к ним обращаться и получать из них информации. Это крутое новшество, которое тянет на отдельный пост, который мы позже принесем
Отдельным пунктом хочу еще выделить, что наконец-то Xcode получит интеграцию с chatgpt и другими llm, в том числе и локально запущенными 🔥
Если хотите глубже погрузиться в архитектуру, узнать больше про пост/пре-трейн и оптимизации моделей, на каких данных и как обучалась, то вам точно нужно зайти сюда. Еще завезли отдельный HIG, посвященный генеративным AI.
#wwdc2025
WWDC прошел и, как обычно, показали много нового и интересного (нет, особенно ужасен новый дизайн Liquid Glass). Для меня самое интересное – это новые AI инструменты и возможности и тут на самом деле было много интересного.
Apple показали фрейморк Foundation Models для работы с llm on-device в приложениях. Из основного:
- полностью нативная реализация и интеграция со swift'ом. Сама модель адаптирована под работу на Apple процессорах
- модель: 3B квантизованная до 2х бит: создать полноценного чат бота с ней не выйдет, но с задачами суммаризации, генерацией / понимаем текста и другими несложными llm-based задачами она более чем может справится
- есть возможность не промптом, а с помощью макросов управлять и структурировать формат ответа модели. Этот подход назвали "guided generation". Если кратко, то мы описываем энамы и структуры, и говорим, что хотим от модели в таком формате получать ответ и будем его именно так и получать
- появится новый инструмент отладки и тестирования работы с моделью
- самое важное и крутое на мой взгляд: "Tool calling": мы можем "зарегистрировать" функции приложения и сказать модели, что она может к ним обращаться и получать из них информации. Это крутое новшество, которое тянет на отдельный пост, который мы позже принесем
Отдельным пунктом хочу еще выделить, что наконец-то Xcode получит интеграцию с chatgpt и другими llm, в том числе и локально запущенными 🔥
Если хотите глубже погрузиться в архитектуру, узнать больше про пост/пре-трейн и оптимизации моделей, на каких данных и как обучалась, то вам точно нужно зайти сюда. Еще завезли отдельный HIG, посвященный генеративным AI.
#wwdc2025
👍10
Code-along: Bring on-device AI to your app using the Foundation Models framework
😮 Продолжаем погружаться в нововведения AI от Apple.
В данном видео разбирают работу с новыми инструментами на примере разработки приложения, помогающего спланировать путешествия.
Из ключевых моментов:
➡️ Написание хорошего промпта играет ключевую роль в достижении хороших результатов. Для упрощения процесса мы можем воспользоваться макросом
Есть две сущности -
Еще в помощь🤫
➡️ Для отладки работы приложения, использующего Foundation Models подвезли новый инструмент. Он так и называется
Здесь будет видно и количество времени, потраченное на загрузку ассетов, обозначен трек инференса, отдельно будут вызовы тулов. Выглядит круто. После профилирования можно сразу заняться оптимизацией - например: делать загрузку модели еще до того, как пользователь отправит свой запрос.
#wwdc2025
В данном видео разбирают работу с новыми инструментами на примере разработки приложения, помогающего спланировать путешествия.
Из ключевых моментов:
#Playground
в любом файле и там экспериментировать с получаемыми результатами - ответ будет сразу на канвасе. Есть две сущности -
Prompt
и Instructions
. Вторая - это что-то вроде системного промпта, недоступного пользователю. Очень полезная штука для предварительной «настройки» модели перед ответом на запросы.Еще в помощь
#Generable
и #Guide
, но про них нужен отдельный пост Foundation Models Instrument
Здесь будет видно и количество времени, потраченное на загрузку ассетов, обозначен трек инференса, отдельно будут вызовы тулов. Выглядит круто. После профилирования можно сразу заняться оптимизацией - например: делать загрузку модели еще до того, как пользователь отправит свой запрос.
#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Deep dive into the Foundation Models framework
😮 В этой сессии нам дают больше информации про три вещи:
➡️ В первой части достаточно знакомые вещи для всех, кто хоть как-то погружен в LLM: рассказывают, что такое токены, как они семплируются, влияние температуры на случайные ответы.
⚡️ Про
Итак, это макрос, который генерирует схему во время компиляции, после чего она инжектится в запросы к модели. Во время ответов модель генерирует различные токены. И если нас не устраивает название этого токена (например, модель вместо
⚙️ В дополнение есть макрос
- если это поле
- если это массив, то можно задать количество элементов, которое нужно сгенерировать;
- можно даже использовать регулярные выражения, чтобы сгенерировать строки по определенным шаблонам;
🔝 Еще есть такая штука, как DynamicGenerationSchema - если вам нужно генерировать структуру ответов не во время компиляции, а в рантайме. Пример: пользователь может добавить свои схемы для NPC - они могут начать задавать вопросы с выбором ответов. Это добавляет намного больше вариативности и гибкости.
🆕 Вообщем, выглядит очень круто - не нужно тратить кучу времени на правильный парсинг всех ответов.
В завершении нам рассказывают про то, как делать тулы и как с ними работать. Но об этом в следующий раз🙂
#wwdc2025
LanguageModelSession
, @Generable
и Tool calling
.Generable
уже интереснее.Итак, это макрос, который генерирует схему во время компиляции, после чего она инжектится в запросы к модели. Во время ответов модель генерирует различные токены. И если нас не устраивает название этого токена (например, модель вместо
name:
сгенерирует firstName:
), то согласно схеме этот токен «маскируется» под необходимый ответ. Это на самом деле очень круто, поскольку заставить модель отвечать так, как нужно не такая простая задача.@Guide
, который применяется к полям в схеме с @Generable. С его помощью можно наложить определенные ограничения на поля. Например: - если это поле
Int
, мы можем задать диапазон от 1 до 3 и ответы не будут выходить за его пределы;- если это массив, то можно задать количество элементов, которое нужно сгенерировать;
- можно даже использовать регулярные выражения, чтобы сгенерировать строки по определенным шаблонам;
В завершении нам рассказывают про то, как делать тулы и как с ними работать. Но об этом в следующий раз
#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥2👍2
Tool Calling
В продолжении прошлого поста поговорим про тулинг для моделей.
⚡️
Например, в видео из поста выше делают запрос контактов и на основе результатов модель может сгенерировать нового персонажа в игре.
⚠️ Из рекомендаций:
- стоит давать название инструменту понятное и короткое на английском языке
- описание также рекомендуют делать в одно приложение.
❓ Это нужно для того, чтобы модель понимала когда использовать инструмент опираясь на название и описание - эти две части будут переданы в промпте.
Вот так выглядит пример инструмента:
А так его использование:
⚙️ Для дебага сессии можно использовать свойство
#wwdc2025
В продолжении прошлого поста поговорим про тулинг для моделей.
Tool
представляет из себя инструмент, с помощью которого модель может выполнять какой либо код в вашем приложении для получения актуальной или дополнительной информации. Например, в видео из поста выше делают запрос контактов и на основе результатов модель может сгенерировать нового персонажа в игре.
- стоит давать название инструменту понятное и короткое на английском языке
- описание также рекомендуют делать в одно приложение.
Вот так выглядит пример инструмента:
struct BreadDatabaseTool: Tool {
let name = "searchBreadDatabase"
let description = "Searches a local database for bread recipes."
@Generable
struct Arguments {
@Guide(description: "The type of bread to search for")
var searchTerm: String
@Guide(description: "The number of recipes to get", .range(1...6))
var limit: Int
}
struct Recipe {
var name: String
var description: String
var link: URL
}
func call(arguments: Arguments) async throws -> ToolOutput {
var recipes: [Recipe] = []
// Put your code here to retrieve a list of recipes from your database.
let formattedRecipes = recipes.map {
"Recipe for '\($0.name)': \($0.description) Link: \($0.link)"
}
return ToolOutput(GeneratedContent(properties: ["recipes": formattedRecipes]))
}
}
А так его использование:
let session = LanguageModelSession(
tools: [BreadDatabaseTool()]
)
let response = try await session.respond(
to: "Find three sourdough bread recipes"
)
transcript
самой сессии.
Оно даст полную историю взаимодействия модели: вызовы инструментов, ответы инструментов, промпты, инструкции.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4