Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
Рекрутеры тянут неделями, ATS теряет резюме, а фидбека вообще можно не дождаться. Совсем другая история — написать напрямую CTO или тимлиду: ответ приходит за день-два, а созвон назначают сразу. Учимся находить технических лидеров стартапов и продуктовых компаний и писать так, чтобы точно получить ответ.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Приготовили для вас дайджест по актуальному из мира iOS, Android.
Несмотря на то, что использование Optional самая настоящая рутина для любого iOS-разработчика, в тонкости реализации этого механизма мы погружаемся только при первом знакомстве с языком. Автор предлагает чуть углубиться, чтобы уверенно говорить на эту тему с коллегой или интервьюером.
Редакторы App Store отмечают 45 разработчиков приложений и игр за их достижения в области инноваций, пользовательского опыта и культурного влияния.
Это не просто утилита для тестирования. Это демонстрация идиоматичности дизайна Kotlin. Он использует лучшие возможности языка, такие как мощные DSL, функции расширения и первоклассную поддержку корутин, чтобы создать API, который ощущается не как инструмент, а как естественное расширение самого Kotlin.
Для использования готовых нативных библиотек в MAUI нам предлагают механизмы Binding native library и Native Library Interop.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Абстрактный класс — это класс, представляющий из себя "заготовку" для целого семейства классов, который описывает для них общий шаблон поведения. Экземпляр такого класса не может быть создан. Абстрактному классу не нужен модификатор open, потому что он "открыт" для наследования по умолчанию.
В теле класса можно объявлять абстрактные свойства и функции. Это полезно, когда часть поведения класса не имеет смысла без реализации в более конкретном подклассе.
abstract class Tree {
abstract val name: String
abstract val description: String
abstract fun info()
}Каждый наследник обязан переопределять их все.
class Pine : Tree() {
override val name = "Сосна"
override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
override fun info() = "$name - ${description.toLowerCase()}."
}Свойства и функции необязательно должны быть абстрактными. У них может быть обобщенная реализация, которая будет с пользой наследоваться всеми подклассами. В этом случае для них в абстрактном классе объявляется конкретная реализация, к которой имеют доступ все наследники.
abstract class Tree {
abstract val name: String
abstract val description: String
fun info(): String = "$name - ${description.toLowerCase()}."
}
...
class Pine : Tree() {
override val name = "Сосна"
override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
}
...
val pine = Pine()
println(pine.info())Так как этот компонент класса уже не будет абстрактным, наследники не смогут его переопределить.
class Pine : Tree() {
override val name = "Сосна"
override val description = "Хвойное дерево с длинными иглами и округлыми шишками"
// ошибка: функция "info" является "final" и не может быть переопределена
override fun info() = description
}Чтобы это исправить, нужно явно задать модификатор
open для функции с конкретной реализацией. Тогда у наследников появляется выбор: либо не переопределять функцию и использовать реализацию суперкласса, либо переопределить и указать свою собственную реализацию.abstract class Tree {
abstract val name: String
abstract val description: String
open fun info(): String = "$name - ${description.toLowerCase()}."
}У абстрактного класса может быть конструктор.
abstract class Tree(val name: String, val description: String) {
open fun info(): String = "$name - ${description.toLowerCase()}."
}Тогда каждый наследник должен предоставить для него значения.
class Pine(name: String, description: String) : Tree(name, description)
...
val pine = Pine("Сосна", "Хвойное дерево с длинными иглами и округлыми шишками")
println(pine.info())
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 А правда, что математика в Data Science не нужна?
Нет. Без неё вы не пройдёте собес и не поймёте, почему модель ведёт себя странно. Линал, матан и вероятности — это база, без которой работа в ML превращается в угадайку.
🔥 Эту базу можно собрать за 2 месяца на экспресс-курсе «Математика для Data Science».
👩🏫 Кто ведёт курс:
→ Мария Тихонова
PhD, руководитель исследовательского направления в SberAI, доцент ВШЭ.
→ Диана Миронидис
Преподаватель ВШЭ, автор научпоп-материалов по математике для блога МТС.
→ Ксения Кондаурова
Преподаватель преподаватель T-Банка, автор курсов ЦУ и Edutoria.
→ Маргарита Бурова
Академический руководитель программ по аналитике и ML, Wildberries & Russ.
🎁 Что сейчас доступно:
→ бесплатный тест, чтобы узнать свой уровень математики;
→ скидка 40% до 30 ноября;
→ если оплатить до конца ноября, курс «Базовая математика» в подарок.
👉 Пишите менеджеру, если хотите попасть в поток
Нет. Без неё вы не пройдёте собес и не поймёте, почему модель ведёт себя странно. Линал, матан и вероятности — это база, без которой работа в ML превращается в угадайку.
🔥 Эту базу можно собрать за 2 месяца на экспресс-курсе «Математика для Data Science».
👩🏫 Кто ведёт курс:
→ Мария Тихонова
PhD, руководитель исследовательского направления в SberAI, доцент ВШЭ.
→ Диана Миронидис
Преподаватель ВШЭ, автор научпоп-материалов по математике для блога МТС.
→ Ксения Кондаурова
Преподаватель преподаватель T-Банка, автор курсов ЦУ и Edutoria.
→ Маргарита Бурова
Академический руководитель программ по аналитике и ML, Wildberries & Russ.
🎁 Что сейчас доступно:
→ бесплатный тест, чтобы узнать свой уровень математики;
→ скидка 40% до 30 ноября;
→ если оплатить до конца ноября, курс «Базовая математика» в подарок.
👉 Пишите менеджеру, если хотите попасть в поток
При создании интерфейсов на основе данных в SwiftUI вам часто будет требоваться визуализировать числовое значение или управлять им. Для этой цели можно использовать три встроенных представления —
Gauge, ProgressView, и Slider.Хотя на первый взгляд они могут показаться похожими, они существенно различаются по назначению и способу взаимодействия.
🔹 Индикатор — отображение значения в диапазоне
Представленный в iOS 16 вид
Gauge предназначен для отображения значения, а не для того, чтобы пользователи могли его изменять.Он идеально подходит для случаев, когда вам нужен индикатор только для чтения, например для отображения уровня заряда батареи, температуры или загрузки процессора.
Gauge(value: currentTemp, in: 0...100) {
Text("Temperature")
} currentValueLabel: {
Text("\(Int(currentTemp))°C")
}
.tint(.orange)
Gauge(value: currentTemp, in: 0...100) {
Text("Temperature")
} currentValueLabel: {
Text("\(Int(currentTemp))°C")
}
.tint(.orange)Индикатор может быть выполнен в нескольких стилях (
.linearCapacity, .accessoryCircular и других) и естественным образом адаптируется к различным макетам — от круглых индикаторов в стиле приборной панели до компактных виджетов.Используйте
Gauge , когда:🔹 ProgressView — индикатор выполнения задачи
ProgressView предназначен для отслеживания прогресса, а не для отображения числовых значений. Он показывает, какая часть задачи выполнена, либо детерминированно (известная доля), либо неопределённо (индикатор вращения).ProgressView(value: progress, total: 1.0)
.tint(.green)
ProgressView(value: progress, total: 1.0)
.tint(.green)
Он хорошо подходит для экранов загрузки/выгрузки, процессов адаптации или длительных операций.
Ключевое отличие от
Gauge заключается в контексте: значение представляет не реальное измерение, а состояние процесса.Используйте
ProgressView , когда:🔹 Ползунок — обеспечивает прямое управление пользователем
В отличие от
Gauge и ProgressView, Slider позволяет вводить данные. Это правильный выбор, если вы хотите, чтобы пользователь мог установить или изменить числовое значение, например яркость, громкость или интенсивность фильтра.Slider(value: $volume, in: 0...100) {
Text("Volume")
}
.tint(.blue)
Slider(value: $volume, in: 0...100) {
Text("Volume")
}
.tint(.blue)Slider напрямую связывается со свойством состояния с помощью Binding, что делает его оптимальным вариантом для любой интерактивной числовой настройки.Используйте
Slider , когда:🔹 Выбор правильного представления
При выборе из трёх вариантов:
Gauge.ProgressView.Slider.Каждый из этих видов соответствует принципам дизайна Apple, нап равленным на ясность и доступность. Понимание их сути поможет вам создавать интерфейсы, которые будут выглядеть правильно и вести себя естественно в экосистеме SwiftUI.
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Специализация или универсальность в мобильной разработке
Многие мобайл-разработчики приходят в индустрию через одну платформу — iOS или Android — и годами качают глубину в одной экосистеме.
Другие же выбирают путь «универсального бойца»: могут собрать фичу на обе платформы, пишут на Flutter/KMM, знают и Xcode, и Android Studio, и умеют ковыряться в любом стеке.
Но что сегодня выгоднее?
С одной стороны — узкие спецы ценятся выше за глубину.
С другой — универсалы легче адаптируются, быстрее растут и реже «сидят без задач».
А вы сами куда относитесь? Расскажите в комментариях — интересно понять, куда движется рынок👇
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸 Библиотека мобильного разработчика
#междусобойчик
Многие мобайл-разработчики приходят в индустрию через одну платформу — iOS или Android — и годами качают глубину в одной экосистеме.
Другие же выбирают путь «универсального бойца»: могут собрать фичу на обе платформы, пишут на Flutter/KMM, знают и Xcode, и Android Studio, и умеют ковыряться в любом стеке.
Но что сегодня выгоднее?
С одной стороны — узкие спецы ценятся выше за глубину.
С другой — универсалы легче адаптируются, быстрее растут и реже «сидят без задач».
А вы сами куда относитесь? Расскажите в комментариях — интересно понять, куда движется рынок
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
Team Lead мобильной разработки — удалёнка
IOS-разработчик (Middle+ / Senior) — от 275 000 до 325 000 ₽, удалёнка
Android Developer (Senior) — от 200 000 до 350 000 ₽, удалёнка
IOS Developer (Middle) / Разработчик iOS — от 200 000 до 300 000 ₽, удалёнка
Ведущий IOS разработчик (Swift) — от 250 000 до 350 000 ₽, удалёнка
🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Миграция базы данных требуется всякий раз, когда нам нужно внести изменения в модель Core Data. Для определённого набора изменений Core Data может выполнить почти автоматическую миграцию, которая называется облегчённой миграцией.
Это позволяет нам развивать нашу схему без потери существующих данных или необходимости вручную определять правила сопоставления.
Примеры поддерживаемых изменений: добавление, переименование или удаление сущностей, атрибутов или связей, а также изменение типов связей.
Когда изменения в нашей модели выходят за рамки того, что может определить Core Data, нам необходимо выполнить сложную (ручную) миграцию.
Давайте рассмотрим, как выполнить упрощённую миграцию в Core Data.
🔹 Как выполнить упрощённую миграцию в Core Data
Чтобы выполнить упрощённую миграцию в Core Data, необходимо выполнить следующие действия:
1. Включение облегченной миграции
2. Создание новой версии модели
3. Изменение новой модели
Давайте рассмотрим эти этапы более подробно.
Когда мы используем класс NSPersistentContainer для создания стека Core Data и управления им, нам не нужно выполнять никаких дополнительных действий по настройке, облегчённая миграция активируется автоматически.
Если мы создадим собственный стек Core Data вручную, то сможем явно включить эти параметры при добавлении хранилища:
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
let options = [
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true
]
do {
try coordinator.addPersistentStore(
ofType: NSSQLiteStoreType,
configurationName: nil,
at: url,
options: options
)
} catch {
// handle migration failure
}
Эти два параметра позволяют Core Data автоматически определять модель сопоставления и переносить данные при обнаружении совместимого изменения схемы.
Для автоматической миграции Core Data нужны исходная и конечная версии нашей модели данных.
Если мы изменим существующий
.xcdatamodeld сразу после выпуска нашего приложения, Core Data не будет знать, как выполнить миграцию, и выдаст ошибку о несовместимости моделей.Чтобы избежать этого, мы создаем новую версию модели, выбрав
Редактор > Добавить версию модели в меню Xcode. Это добавит новый файл .xcdatamodel в наш проект.После добавления новой версии мы можем установить текущую версию в инспекторе файлов Xcode. Теперь мы можем спокойно вносить изменения, не нарушая работу существующих хранилищ.
Теперь мы можем вносить изменения в нашу модель. Чтобы Core Data могла создать предполагаемую модель сопоставления, изменения должны соответствовать определённому шаблону, например:
let inferred = try? NSMappingModel.inferredMappingModel(
forSourceModel: oldModel,
destinationModel: newModel
)
if inferred != nil {
// Lightweight migration is possible
}
Если этот вызов вернёт nil, Core Data не сможет определить сопоставление, а это значит, что нам потребуется более сложная миграция вручную.
🔸 Курс «Архитектуры и шаблоны проектирования»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
xcrun instruments – профилирование и анализ производительности iOS-приложенийПрофессиональный инструмент для измерения производительности, поиска утечек памяти и анализа энергопотребления прямо из командной строки.
Запуск профилирования:
# Запуск Instruments с шаблоном Allocations
xcrun instruments -t "Allocations" -l 30000 MyApp.app
# Профилирование времени запуска
xcrun instruments -t "Time Profiler" MyApp.app -e UIResponder 30
Автоматизация тестов:
# Запуск с записью результатов в .trace файл
xcrun instruments -t "Time Profiler" -D performance.trace MyApp.app
1. Анализ утечек памяти:
# Запуск Leaks теста на 60 секунд
xcrun instruments -t "Leaks" MyApp.app -l 60000
# С сохранением результатов
xcrun instruments -t "Leaks" -D memory_leaks.trace MyApp.app -l 30000
2. Измерение времени запуска:
# Профилирование запуска приложения
xcrun instruments -t "Time Profiler" MyApp.app -e UIResponder 10 -D launch.trace
3. Анализ энергопотребления:
# Мониторинг использования батареи
xcrun instruments -t "Energy Log" MyApp.app -l 120000
Allocations – отслеживание памяти и объектовTime Profiler – анализ производительности кодаLeaks – поиск утечек памятиEnergy Log – мониторинг энергопотребленияNetwork – анализ сетевой активностиCore Data – профилирование операций с базой данныхПрофилирование конкретного процесса:
# Присоединение к запущенному процессу
xcrun instruments -t "Time Profiler" -p 1234
Создание кастомных конфигураций:
# Сохранение конфигурации профилирования
xcrun instruments -t "Time Profiler" -c "My Custom Config" MyApp.app
Пакетное тестирование:
#!/bin/bash
# performance_test.sh
APP="MyApp.app"
TRACE_DIR="./traces"
mkdir -p $TRACE_DIR
echo "Running performance tests..."
xcrun instruments -t "Time Profiler" -D "$TRACE_DIR/time_profiler.trace" $APP -l 30000
xcrun instruments -t "Allocations" -D "$TRACE_DIR/allocations.trace" $APP -l 30000
Какие инструменты профилирования вы используете в своих проектах?
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#буст #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🤝1
🎄 Скоро Новый год, а ты всё ещё не в бигтехе?
Если твой путь лежит в ML, DS или AI, то одна вещь решает всё: математика. Без неё — хоть три проекта сделай, хоть сотню туториалов посмотри — на собесе тебя всё равно вернут на «а что такое градиент?»
🔥 Экспресс-курс «Математика для Data Science» — 8 недель, чтобы закрыть базу раз и навсегда.
Что внутри:
🔘 живые вебинары, где можно задавать вопросы экспертам
🔘 записи лекций + доступ к материалам
🔘 практические задания на Python и финальный мини-проект с фидбеком
🔘 программа обновлена в ноябре 2025
🔘 2 месяца только нужного — без воды
🔘 достаточно школьной математики и базового Python
🎁 Бонусы ноября:
→ 40% скидка до 30 ноября
→ при оплате до конца месяца — курс «Базовая математика» в подарок
→ бесплатный тест, чтобы узнать свой уровень математики
👉 Хочу стартовать
Если твой путь лежит в ML, DS или AI, то одна вещь решает всё: математика. Без неё — хоть три проекта сделай, хоть сотню туториалов посмотри — на собесе тебя всё равно вернут на «а что такое градиент?»
🔥 Экспресс-курс «Математика для Data Science» — 8 недель, чтобы закрыть базу раз и навсегда.
Что внутри:
🔘 живые вебинары, где можно задавать вопросы экспертам
🔘 записи лекций + доступ к материалам
🔘 практические задания на Python и финальный мини-проект с фидбеком
🔘 программа обновлена в ноябре 2025
🔘 2 месяца только нужного — без воды
🔘 достаточно школьной математики и базового Python
🎁 Бонусы ноября:
→ 40% скидка до 30 ноября
→ при оплате до конца месяца — курс «Базовая математика» в подарок
→ бесплатный тест, чтобы узнать свой уровень математики
👉 Хочу стартовать
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему приложение крашится при быстром нажатии кнопки?
Anonymous Quiz
10%
Неправильное обновление UI из фонового потока
52%
UI блокируется вызовом Thread.sleep() в основном потоке
14%
Race condition при изменении переменной counter
7%
Утечка памяти в OnClickListener
17%
Посмотреть ответ
Послушать диджей-сет и найти работу
Мобильные разработчики, особенно стеснительные — информация для вас. В Сколково в эту пятницу (28 ноября) пройдет нетворк для геймдев-тусовки, утренний кофе-рейв. Там соберутся эйчары студий, инвесторы, геймдизайнеры, нарративщики, программные инженеры, продюсеры, чтобы найти проект, привлечь инвестиции или собрать команду. Музыка бодрая, атмосфера приятная, так что знакомства завязываются сами собой. Чтобы начинать разговоры было проще, на стаканчики наклеят цветные стикеры: один покажет, кто ты, второй — кого ищешь. Классный лайфхак, который поможет комфортно заводить полезные контакты даже интровертам.
Так что от вас требуется только прийти, взять на входе кофе (бесплатный, причем), потусить и уйти с новым проектом. Вход свободный, нужна только регистрация.
28 ноября, Сколково (Большой бульвар, 40), с 10 до 11 утра
Мобильные разработчики, особенно стеснительные — информация для вас. В Сколково в эту пятницу (28 ноября) пройдет нетворк для геймдев-тусовки, утренний кофе-рейв. Там соберутся эйчары студий, инвесторы, геймдизайнеры, нарративщики, программные инженеры, продюсеры, чтобы найти проект, привлечь инвестиции или собрать команду. Музыка бодрая, атмосфера приятная, так что знакомства завязываются сами собой. Чтобы начинать разговоры было проще, на стаканчики наклеят цветные стикеры: один покажет, кто ты, второй — кого ищешь. Классный лайфхак, который поможет комфортно заводить полезные контакты даже интровертам.
Так что от вас требуется только прийти, взять на входе кофе (бесплатный, причем), потусить и уйти с новым проектом. Вход свободный, нужна только регистрация.
28 ноября, Сколково (Большой бульвар, 40), с 10 до 11 утра
👾 Библиотека Jetpack Navigation 3 стала стабильной
Jetpack Navigation 3 стал стабильным в версии 1.0. Используйте библиотеку в своих приложениях уже сегодня. Например, JetBrains уже использует её в своём приложении KotlinConf.
Navigation 3 — это новая навигационная библиотека, полностью разработанная для поддержки состояний Jetpack Compose. Она предоставляет полный контроль над стеком переходов, помогает сохранять состояние навигации и позволяет легко создавать адаптивные макеты (например, list-detail). У JetBrains даже есть кроссплатформенная версия.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸 Библиотека мобильного разработчика
#свежак
Jetpack Navigation 3 стал стабильным в версии 1.0. Используйте библиотеку в своих приложениях уже сегодня. Например, JetBrains уже использует её в своём приложении KotlinConf.
Navigation 3 — это новая навигационная библиотека, полностью разработанная для поддержки состояний Jetpack Compose. Она предоставляет полный контроль над стеком переходов, помогает сохранять состояние навигации и позволяет легко создавать адаптивные макеты (например, list-detail). У JetBrains даже есть кроссплатформенная версия.
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
XcodeProjectCLI — быстрый и лёгкий CLI инструмент для управления проектами Xcode, полностью написанный на Swift. Легко интегрируйте его в свой рабочий процесс разработки или автоматизируйте сложные задачи рефакторинга всего несколькими командами.
🔹 Курс «Математика для Data Science»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1