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
❤1
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 экземпляром
21%
Отсутствие механизма уведомления об изменениях
10%
Неправильная работа с массивами
38%
Race condition при добавлении товаров
19%
Посмотреть ответ
Когда приложение дорастает до сотен тысяч строк, изменения в глубоком компоненте заставляют править все промежуточные функции. Они лишь передают зависимость, что превращает рефакторинг в массовую правку и создаёт технический шум.
Эту проблему решают в разных языках: Scala, Kotlin, Android. В Swift же встроенного решения нет. Поэтому команда Яндекс Браузере сделала open-source библиотеку Implicits — механизм неявной передачи зависимостей с проверкой на этапе компиляции.
В статье автор расскажет о поиске собственного подхода. Внедрение Implicits сокращает boilerplate, ускоряет рефакторинг и улучшает читаемость кода — зависимости объявляются локально там, где реально используются. Также покажет примеры из продакшен-кода Яндекс Браузера.
#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Быстрое ревью без запуска Android Studio и Xcode
Мобильные проекты часто отличаются глубокой вложенностью и сложными зависимостями. Чтобы качественно отревьюить PR, приходится запускать тяжелые IDE, ждать индексации Gradle или сборки проекта. Это убивает время.
SourceCraft предлагает альтернативу: умная навигация доступна прямо в браузере. Платформа понимает контекст, позволяет переходить к декларациям классов и методов, смотреть использования и типы переменных. Всё это работает мгновенно, не требуя локальной настройки окружения автора кода.
Оцените скорость работы инструмента → https://sourcecraft.dev/code-navigation-demo/uikit/pr/2040
Мобильные проекты часто отличаются глубокой вложенностью и сложными зависимостями. Чтобы качественно отревьюить PR, приходится запускать тяжелые IDE, ждать индексации Gradle или сборки проекта. Это убивает время.
SourceCraft предлагает альтернативу: умная навигация доступна прямо в браузере. Платформа понимает контекст, позволяет переходить к декларациям классов и методов, смотреть использования и типы переменных. Всё это работает мгновенно, не требуя локальной настройки окружения автора кода.
Оцените скорость работы инструмента → https://sourcecraft.dev/code-navigation-demo/uikit/pr/2040
👍2
Можете ли вы определить перечисление с такими значениями? Почему?
enum Edges : (Double, Double) {
case TopLeft = (0.0, 0.0)
case TopRight = (1.0, 0.0)
case BottomLeft = (0.0, 1.0)
case BottomRight = (1.0, 1.0)
}• Соответствовать протоколу Equatable.
• Литерально преобразовываться из типов: Int, String, Character.
В приведенном выше коде это не соблюдено.
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM