Отправлять по 50 откликов в день, готовиться к техническим интервью, делать сайт-портфолио — все это можно автоматизировать с помощью ИИ. Мы протестировали кучу сервисов и выбрали только те, что реально экономят время и повышают шансы на оффер. Читай и внедряй.
👉 Читать статью
🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Приготовили для вас дайджест по актуальному из мира iOS, Android.
Используя Transferable, вы не только упрощаете реализацию, но и делаете своё приложение совместимым с современными формами взаимодействия, от буфера обмена до перетаскивания, используя единую модель данных.
В этой статье вы узнаете, что такое RemoteCompose, поймете его основную архитектуру и откроете для себя преимущества, которые он предоставляет для динамического создания экранов с помощью Jetpack Compose.
Автор расскажет, как снизил потребление памяти macOS-приложения на Flutter более чем на 90%. Это потребовало неожиданно много усилий и включало создание собственного хоста для Flutter, разработку пользовательского плагина для перетаскивания и отладку кучи кода на Rust.
🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Замыкания (сlosures) представляют самодостаточные блоки кода, которые могут использоваться многократно в различных частях программы, в том числе в виде параметров в функциях.
По сути функции являются частным случаем замыканий. Замыкания могут иметь одну из трех форм:
В прошлых темах были рассмотрены глобальные и вложенные функции, поэтому в данной теме рассмотрим только замыкающие выражения.
Замыкающие выражения в общем случае имеют следующий синтаксис:
{ (параметры) -> тип_возвращаемого_значения in
инструкции
}Если замыкания не имеют параметров или не возвращают никакого значения, то соответствующие элементы при определении замыкания могут опускаться.
Подобно тому, как переменная или константа могут представлять ссылку на функцию, они также могут представлять ссылку на замыкание:
let hello = { print("Hello world")}
hello()
hello()В данном случае константе hello присваивается анонимная функция, которая состоит из блока кода, в котором выполняются некоторые действия. Эта функция не имеет никакого имени, мы ее можем вызывать только через константу hello.
Фактически константа hello в данном случае имеет тип ()->() или ()-gt;Void:
let hello: ()->Void = { print("Hello world")}Дополнительно можно определить список параметров с помощью ключевого слова in:
let hello = {
(message: String) in
print(message)
}
hello("Hello")
hello("Salut")
hello("Ni hao")В данном случае замыкание принимает один параметр - message, который представляет тип String. Список параметров указывается до ключевого слова in, а после идут инструкции функции.
Также можно определить возвращаемое значение:
let sum = {
(x: Int, y: Int) -> Int in
return x + y
}
print(sum(2, 5)) // 7
print(sum(12, 15)) // 27
print(sum(5, 3)) // 8#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллеги, давайте разберем, как легко рисовать и анимировать полосатые узоры в Jetpack Compose с помощью всего лишь одной умной функции.
🔹 Основная идея
Всё строится на использовании
Brush.linearGradient() и параметра colorStops. Секрет в том, чтобы разместить две цветовые точки с разными цветами в одной позиции. Это создаст не плавный переход, а резкую границу между полосами.🔹 От простого к сложному
1. Создаем две половинки:
Brush.linearGradient(
0.0f to Color.Black, // Начало черного
0.5f to Color.Black, // Конец черного (резкий переход!)
0.5f to Color.White, // Начало белого (в той же точке)
1.0f to Color.White // Конец белого
)
2. Рисуем повторяющийся узор:
Добавляем
TileMode.Repeated и задаем размер одного повторения через start и end:start = Offset(0f, 0f),
end = Offset(20f, 0f),
tileMode = TileMode.Repeated
3. Анимируем смещением:
Двигаем начальную и конечную точки с помощью
animatedOffset — и полосы "побежали".🔹 Готовое решение: функция
Brush.stripes()Чтобы не возиться с
colorStops каждый раз, можно создать удобную функцию-расширение:fun Brush.Companion.stripes(
vararg stripes: Pair<Color, Float>, // Цвет и его "вес"
width: Float = 20f, // Ширина одного повторения
angle: Float = 45f, // Угол наклона
phase: Float = 0f // Сдвиг для анимации
): Brush { ... }
Использовать — одно удовольствие:
// Равные полосы
Brush.stripes(
Color.Pink to 1f,
Color.Transparent to 1f,
width = 10.dp.toPx(),
angle = 45f
)
// Разные ширины и цвета
Brush.stripes(
Color.Red to 1f,
Color.Blue to 2f, // В 2 раза шире
Color.Green to 1f
)
🔹 Пример анимации загрузки
val phase by rememberInfiniteTransition()
.animateFloat(0f, 1f, animationSpec = infiniteRepeatable(tween(300)))
Box(
modifier = Modifier
.fillMaxWidth()
.height(4.dp)
.drawBehind {
drawRect(
brush = Brush.stripes(
White to 1f,
Zinc900 to 1f,
width = 10.dp.toPx(),
angle = 45f,
phase = -phase // Анимируем здесь!
)
)
}
)
🔹 Итог
Техника простая, но мощная:
• Основа — резкие градиенты через
colorStops• Повторение —
TileMode.Repeated• Анимация — смещение
phase или точек• Упрощение — своя функция
Brush.stripes()Отлично подходит для индикаторов загрузки, фоновых текстур, визуальных эффектов.
#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Релиз-кандидат твоей карьеры 2026
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib
В мобилке конкуренция бешеная. Чтобы твое резюме не крашилось на этапе скрининга, нужно качать фундаментальные скиллы.
Запускаем новогодний оффер 1 + 2:
Покупаешь один курс — получаешь три. Оплачивается только самый дорогой, остальные идут бонусом.
Что выбирают мобильные разработчики:
— алгоритмы и структуры данных (база для FAANG);
— архитектуры и шаблоны проектирования.
Обновить версию себя
Актуально до 31 декабря.
Сложно выбрать? Пиши менеджеру: @manager_proglib
git bisect – бинарный поиск коммита, который сломал ваш кодВстроенный в Git инструмент для автоматического поиска коммита, который внёс баг или регрессию. Работает по принципу бинарного поиска — находит проблемный коммит за O(log n) шагов.
• Вы указываете «хороший» коммит (где всё работало)
• Указываете «плохой» коммит (где баг появился)
• Git автоматически перемещает вас по истории
• Вы проверяете каждый коммит и говорите «хорошо» или «плохо»
• Git находит точный коммит с ошибкой
Запуск бинарного поиска:
# Начать поиск
git bisect start
# Указать плохой коммит (обычно текущий)
git bisect bad HEAD
# Указать хороший коммит (например, тег релиза)
git bisect good v1.2.0
# Или по хешу
git bisect good abc123def|
Автоматический поиск:
# Git будет автоматически переключаться между коммитами
# После каждого переключения проверяйте наличие бага:
# Если баг ЕСТЬ в текущем коммите:
git bisect bad
# Если бага НЕТ в текущем коммите:
git bisect good
# Git продолжит поиск, пока не найдёт проблемный коммит
Скрипт для автоматической проверки:
# Создайте скрипт test.sh, который возвращает 0 если тесты проходят, 1 если падают
git bisect start HEAD v1.2.0
git bisect run ./test.sh # Git сам запустит скрипт на каждом коммите
Для мобильной разработки:
#!/bin/bash
# bisect-test.sh для iOS
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15'
if [ $? -eq 0 ]; then
exit 0 # good
else
exit 1 # bad
fi
Прервать поиск:
git bisect reset
Показать текущий статус:
git bisect status
Пометить все коммиты как проверенные:
git bisect replay
#буст #JuniorKit
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩2🥱2
Протокол
Transferable в Swift — это мощный инструмент, который позволяет вашим пользовательским типам данных легко участвовать в системных операциях, таких как перетаскивание (Drag & Drop), копирование-вставка и общий доступ. По сути, он «учит» систему, как преобразовать вашу модель в данные для передачи и как восстановить её на другом конце.🔹 Зачем это нужно?
PasteButton, ShareLink и модификаторами для Drag & Drop.🔹 Как это работает?
Суть в реализации вычисляемого свойства
transferRepresentation. Вам нужно описать, как ваш тип «экспортируется» в данные и «импортируется» обратно.Основные способы представления:
CodableRepresentation: Самый простой способ, если ваш тип уже соответствует Codable.DataRepresentation: Для преобразования объекта в бинарные данные (например, Data).FileRepresentation: Если ваш тип представляет собой файл (изображение, PDF).ProxyRepresentation: Позволяет использовать другой Transferable-тип (например, String) для представления вашего объекта в определённых контекстах.🔹 Практический пример
Допустим, у нас есть структура
Post, и мы хотим, чтобы её можно было копировать как текст.import SwiftUI
import UniformTypeIdentifiers
struct Post: Codable, Transferable {
var text: String
static var transferRepresentation: some TransferRepresentation {
DataRepresentation(contentType: .plainText) { post in
// Экспорт: Post -> Data
post.text.data(using: .utf8) ?? Data()
} importing: { data in
// Импорт: Data -> Post
let content = String(decoding: data, as: UTF8.self)
return Post(text: content)
}
// Дополнительно: можно добавить текстовое представление
ProxyRepresentation(exporting: \.noscript)
}
}
🔹 Итог и совет
Transferable ваш тип можно использовать с ShareLink(post), PasteButton(payload: post), а также сделать его перетаскиваемым с модификатором .draggable(post).Representation, который лучше всего подходит для вашей модели данных (Codable, Data, File или Proxy).Этот протокол открывает двери к гораздо более глубокой и естественной интеграции вашего приложения в экосистему iOS, iPadOS и macOS, делая взаимодействие с данными плавным и интуитивно понятным для пользователя.
#АрхитектурныйКод #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Искусственный интеллект не только автоматизирует рутинные задачи, но и создает новые профессии, о которых еще несколько лет назад никто не слышал. Какие именно — рассказываем в этой статье.
👉 Читать статью
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Атмосфера Нового года по-айтишному 🎄
Это когда гирлянды не на окне, а за монитором, а настроение приходит с Новогодним Git Quest от SourceCraft 🎅
Что ждёт внутри:
Задания открываются по одному каждые два дня в 00:00 МСК — с 10 по 30 декабря.
Ищите их на странице квеста. Кстати, там уже доступно первое тренировочное задание.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
IOS-разработчик — удалёнка
Senior Android Developer — гибрид (Санкт-Петербург)
iOS Developer (Part-Time) — от 1 000 $, удалёнка
Android-разработчик Middle+ — до 300 000 ₽, удалёнка
Middle iOS Developer — от 300 000 ₽, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
MaterialKolor — библиотека Compose Multiplatform для создания динамических цветовых палитр Material Design 3 из любого цвета. Доступные платформы: Android, iOS, JVM (Desktop) и JavaScript/wasm (браузер). Основу этой библиотеки составляет репозиторий material-color-utilities. ||
В настоящее время это библиотека доступна только на Java, и автор хотел сделать её доступной для проектов Kotlin Multiplatform. Исходный код был взят и преобразован в библиотеку Kotlin Multiplatform.
#буст #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему счетчик корзины иногда не обновляется?
Anonymous Quiz
13%
Проблема с статическим shared экземпляром
18%
Отсутствие механизма уведомления об изменениях
11%
Неправильная работа с массивами
38%
Race condition при добавлении товаров
20%
Посмотреть ответ
Когда приложение дорастает до сотен тысяч строк, изменения в глубоком компоненте заставляют править все промежуточные функции. Они лишь передают зависимость, что превращает рефакторинг в массовую правку и создаёт технический шум.
Эту проблему решают в разных языках: Scala, Kotlin, Android. В Swift же встроенного решения нет. Поэтому команда Яндекс Браузере сделала open-source библиотеку Implicits — механизм неявной передачи зависимостей с проверкой на этапе компиляции.
В статье автор расскажет о поиске собственного подхода. Внедрение Implicits сокращает boilerplate, ускоряет рефакторинг и улучшает читаемость кода — зависимости объявляются локально там, где реально используются. Также покажет примеры из продакшен-кода Яндекс Браузера.
#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM