DAF - это метод, при котором человек слышит собственную речь с небольшой задержкой (обычно 50-200 мс) через наушники. Такая обратная связь замедляет речь, снижает автоматизм, при котором возникают судорожные повторы, усиливает контроль над артикуляцией и помогает синхронизировать дыхание с речью.
На первый взгляд идея кажется простой: считать звук с микрофона, добавить задержку и воспроизвести его обратно. Однако на практике корректная реализация DAF на Android оказалась значительно сложнее - в первую очередь из-за особенностей аудиостека и системных задержек.
#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
«Этот манёвр будет стоить нам 51 год...»
— или внушительную часть бюджета на обучение. В мобильной разработке всё меняется быстро, но знание архитектуры и алгоритмов — это ваш билет в BigTech.
До 19 января у вас есть шанс забрать любой курс Proglib Academy по старым ценам:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Успеть до повышения цен
⚠️ Дедлайн — понедельник, 19 января
— или внушительную часть бюджета на обучение. В мобильной разработке всё меняется быстро, но знание архитектуры и алгоритмов — это ваш билет в BigTech.
До 19 января у вас есть шанс забрать любой курс Proglib Academy по старым ценам:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Успеть до повышения цен
⚠️ Дедлайн — понедельник, 19 января
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Compose Hot Reload только что получил статус стабильной версии — 1.0.0. Разработчики усердно работали над созданием технологии, которая проста в использовании и хорошо интегрирована в существующие инструменты, а также не требует от пользователей никакой настройки. Инструмент входит в состав Compose Multiplatform, начиная с версии 1.10.
Compose Multiplatform — это декларативный фреймворк для совместного использования пользовательских интерфейсов на разных платформах. Как правило, для запуска приложения Compose во время разработки необходимо вызвать соответствующие задачи сборки Gradle или запустить его непосредственно из IDE. То же самое относится и к Compose Hot Reload. Запуск приложения можно осуществить, вызвав задачу
./gradlew :myApp:hotRunJvm или нажав кнопку «Запустить с Compose Hot Reload» в IntelliJ IDEA (при условии, что плагин Kotlin Multiplatform уже установлен).После запуска приложения в режиме горячей перезагрузки рядом с окном приложения появится плавающая панель инструментов. Изменение кода в IntelliJ IDEA и нажатие кнопки «Сохранить» (Cmd+S/Ctrl+S) перекомпилирует соответствующий код, выполнит горячую перезагрузку и обновит пользовательский интерфейс, сохранив при этом все части состояния, которые считаются действительными.
Помимо простого изменения графических ресурсов, Compose Hot Reload позволяет вносить практически произвольные изменения в код, включая, помимо прочего, добавление и удаление функций, классов и параметров — короче говоря, все те изменения, которые вы обычно вносите в процессе обычной разработки.
Плавающая панель инструментов рядом с вашим приложением предлагает дополнительные функции, такие как просмотр логов, ручной запуск перезагрузки и сброс состояния пользовательского интерфейса, а также индикацию статуса и многое другое. Однако одним из наиболее важных аспектов любой функции горячей перезагрузки является информирование о возникновении ошибки. Как разработчик, вы всегда должны быть в курсе, когда перезагрузка не удалась, из-за чего ваши текущие изменения кода не отразились в приложении. Это может произойти, например, если вы попытаетесь перезагрузить, но код не скомпилируется и потребует вашего внимания. В таких случаях Compose Hot Reload отобразит ошибку прямо в окне целевого приложения.
Compose Hot Reload — это очень сложный технический проект. В этой статье его авторы постарались выделить наиболее интересные аспекты Compose Hot Reload. Но если вы хотите узнать больше о проекте, посетите репозиторий на GitHub.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚2
Приготовили для вас дайджест по актуальному из мира iOS, Android.
В этой статье автор делится опытом настройки SwiftLint сразу для нескольких репозиториев — так, чтобы кодстайл оставался единым и не расползался со временем.
В статье автор поговорит о поддержке протокола ICMP в контексте разработки приложений под Android.
Автор поделиться своими наработками по тому, как можно удобно совмещать библиотеку Navigation3 и Koin в Compose Multiplatform проекте и какие подводные камни есть на текущий момент.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Объект-выражение — это выражение, которое "на ходу" создает анонимный объект.
Для объекта-выражения не указывается имя!
Если же объекту всё-таки требуется имя, то его можно сохранить в переменной:
val tom = object {
val name = "Tom"
var age = 37
fun sayHello() {
println("Hi, my name is $name")
}
}
println("Name: ${tom.name} Age: ${tom.age}")
tom.sayHello()Анонимные объекты не являются синглтонами!
Каждый раз при выполнении объекта-выражения создаётся новый объект.
Анонимный объект является заменой анонимным внутренним классам в Java.
#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Build failed: price_incrementЧтобы не переплачивать завтра, оформите подписку на профессиональный рост сегодня. После 20 января стоимость всех программ в Proglib.academy пойдёт вверх.
Собрать свой идеальный грейд
Многим разработчикам нужно показывать в своих приложениях отформатированный текст: документацию, статьи, комментарии с разметкой. SwiftUI не имеет встроенной поддержки Markdown, но есть элегантное и мощное решение.
В статье рассматривается использование класса
NSAttributedString из UIKit для преобразования Markdown в отформатированный текст и его отображения в SwiftUI через UIViewRepresentable.🔹 Как это работает: ключевые компоненты
1. Преобразование Markdown в NSAttributedString
Основная "магия" происходит с помощью класса
NSAttributedString. Для обработки Markdown можно использовать встроенный парсер iOS (начиная с iOS 15) или сторонние библиотеки, такие как Down или SwiftyMarkdown. Пример с NSAttributedString:import UIKit
let markdownString = "**Hello**, *SwiftUI*!"
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
.documentType: NSAttributedString.DocumentType.html
]
// Преобразуем Markdown через HTML (один из подходов)
if let data = markdownString.data(using: .utf8),
let attributedString = try? NSAttributedString(data: data,
options: options,
documentAttributes: nil) {
// Используем полученный attributedString
}
2. Отображение в SwiftUI через UIViewRepresentable
Чтобы показать
NSAttributedString в SwiftUI, создаём обёртку UIViewRepresentable для UITextView или UILabel:import SwiftUI
struct MarkdownView: UIViewRepresentable {
let attributedString: NSAttributedString
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.isEditable = false
textView.attributedText = attributedString
textView.backgroundColor = .clear
return textView
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.attributedText = attributedString
}
}
3. Использование в SwiftUI-интерфейсе
Теперь можно использовать
MarkdownView как обычный SwiftUI элемент:struct ContentView: View {
let markdownText = "## Заголовок\nЭто **жирный** текст."
var body: some View {
MarkdownView(attributedString: parseMarkdown(markdownText))
.padding()
}
}🔹 Альтернативные подходы
Text с ограниченной поддержкой Markdown (iOS 15+): В SwiftUI 3 появилась базовая поддержка Markdown внутри Text. Работает для простых случаев:Text("**Жирный** и *курсив*")🔹 Важные нюансы
NSAttributedString может потребовать оптимизации.🔹 Итог
Отображение Markdown в SwiftUI — задача, которая решается с помощью связки
NSAttributedString и UIViewRepresentable. Для более простых случаев можно использовать встроенную в SwiftUI 3 поддержку Markdown, а для максимальной гибкости и функциональности — сторонние библиотеки. Это открывает двери для создания приложений с богатым текстовым контентом прямо внутри ваших SwiftUI-интерфейсов.#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
KMP Developer — от 185 000 до 310 000 ₽, удалёнка
Middle+ / Senior iOS Developer — удалёнка
KMP - Kotlin Multiplatform (Android / iOS) разработчик — от 2 000 $, удалёнка
Flutter-разработчик — удалёнка
iOS разработчик — офис (Москва)
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
С ростом кодовой базы iOS-приложения перед командой встаёт ключевой вопрос: внедрять ли модульную архитектуру? Это мощный инструмент для управления сложностью, но не серебряная пуля для всех проектов.
🔹 Что такое модульность?
Это подход, при котором код разделяется на чёткие, независимые блоки с явными границами. Каждый модуль скрывает свою реализацию за публичным интерфейсом, позволяя частям системы развиваться автономно.
🔹 Когда она оправдана, а когда — нет?
🔹 Три столпа модульной кодовой базы
1. Базовый слой (Foundation): фундамент приложения. Содержит общие модели данных, сетевой стек и техническую инфраструктуру. Должен быть максимально универсальным и не зависеть от модулей выше.
2. Сервисные модули (Services): общие возможности, используемые несколькими фичами (например, кэширование, аналитика). Они зависят только от Foundation.
3. Функциональные модули (Features): пользовательские сценарии с началом и концом (например, "оформление заказа", "лента новостей"). Они зависят от Foundation и Services, но не должны зависеть друг от друга.
🔹 Типичные ошибки
Многие команды внедряют модульность, следуя тренду, но не проектируют связи. Результат:
🔹 Ключевые принципы успеха
🔹 Итог
Модульность — это осознанная практика, а не механический рефакторинг. Её успех зависит не столько от инструментов (Tuist, Swift Package Manager), сколько от архитектурного мышления и командной дисциплины. Правильно реализованная, она превращает код в долгосрочный актив, а не в обузу.
Согласны, что проектировать связи важнее, чем просто резать код на модули? Делитесь опытом в комментариях
#АрхитектурныйКод #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3❤2🥰1
SwiftDataTables позволяет отображать наборы данных в виде красиво отформатированных таблиц для iOS. Главная цель для конечного пользователя — как можно быстрее получить полезную информацию из таблицы с помощью таких функций, как упорядочивание, поиск и листание. Для разработчика — обеспечить простую реализацию с расширяемыми опциями.
Основные возможности включают:
#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
ИИ в кармане: работа с контекстом через RAG
23 января в 19:00 обсудим архитектуры работы LLM с локальными данными на открытом уроке к курсу «Разработка ИИ агентов». Узнаем, как научить ассистента отвечать по документам пользователя без лишних затрат ресурсов.
Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на
На вебинаре разберём:
— использование
— интеграцию векторных баз данных (
— фреймворки для связи интерфейса с логикой ИИ-агентов.
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
23 января в 19:00 обсудим архитектуры работы LLM с локальными данными на открытом уроке к курсу «Разработка ИИ агентов». Узнаем, как научить ассистента отвечать по документам пользователя без лишних затрат ресурсов.
Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на
Kubernetes. В своём видеосообщении Игорь рассказывает о проектировании автономных агентов и практическом опыте в ML, накопленном за 20 лет.На вебинаре разберём:
— использование
RAG для контекстного поиска в приложениях;— интеграцию векторных баз данных (
FAISS, Chroma);— фреймворки для связи интерфейса с логикой ИИ-агентов.
📅 Когда: 23.01 в 19:00 МСК
Узнать подробности
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему возникает NetworkOnMainThreadException?
Anonymous Quiz
29%
Проверка сети требует отдельного потока
49%
Метод exec() выполняется в основном потоке
10%
Неправильное использование ConnectivityManager
4%
Проблема с контекстом
8%
Посмотреть ответ