Мобильный трудоголик
1.33K subscribers
61 photos
9 videos
264 links
👨‍💻 Пишу простым языком об iOS разработке на Swift и мобильной разработке в целом.
🔹 Вошел в IT задолго до того как это стало мейнстримом.
---
‍Обо мне: https://t.me/hardworkerIT/3
Чат: @hardworkerChatIT
Канал про разработку и жизнь в ИТ: @itDenisov
Download Telegram
Как разработчику не застрять в поиске работы на месяцы

Часто вижу, как сильные специалисты месяцами ищут работу без оффера.
Обычно дело не в рынке, а в резюме, LinkedIn и стратегии поиска.

У моего коллеги, карьерного консультанта, на канале как раз об этом:
— как переписать резюме так, чтобы оно приносило интервью
— как оживить LinkedIn и GitHub
— как строить стратегию поиска, а не хаотично откликаться

Если вы в поиске или хотите подготовиться к нему заранее, рекомендую заглянуть.
👉 https://t.me/bezpanikiIT
6👍2😁2👀21
This media is not supported in your browser
VIEW IN TELEGRAM
В Xcode 26 есть возможность попросить ИИ быстро внести изменения в код!

Пока работает только на macOS Tahoe Beta, но выглядит многообещающе.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
23🔥64👍11
🔢 Оператор ~= в Swift: скрытый помощник pattern matching'а.

Вы когда-нибудь задумывались, как на самом деле работает switch-case в Swift? Под капотом он использует малоизвестный, но мощный оператор ~=, который отвечает за сравнение значений.


🤔 Что делает оператор данный оператор?

Это бинарный оператор, который возвращает true, если значения совпадают. По умолчанию он просто сравнивает два значения, но его можно перегружать для кастомной логики.


♣️ Пример с диапазонами:


let range = 1..<10
print(5 ~= range) // true потому что 5 входит в диапазон
print(15 ~= range) // false



⚠️ Кастомная реализация для своих типов.

Давайте создадим свой тип и реализуем для него pattern matching:


protocol Matchable {
var matchKey: String { get }
}

struct User: Matchable {
let email: String
var matchKey: String { email }
}

// Перегружаем оператор ~=
func ~=(pattern: String, value: Matchable) -> Bool {
return value.matchKey == pattern
}

let user = User(email: "test@test.com")

switch user {
case "test@test.com": // Теперь работает благодаря нашему оператору
print("Привет, тестировщик!")
default:
print("Неизвестный пользователь")
}

// Выведет: Привет, тестировщик!



Где это может пригодиться:

🔹 Для сравнения сложных структур.
🔹 При работе с кастомными типами в switch-case.
🔹 Для создания выразительных условий в if-else.


💡 Вывод:

Оператор ~= мощный инструмент для кастомного сравнения значений, который особенно полезен при работе с собственными типами в конструкциях switch и if. Его перегрузка позволяет создавать выразительный и гибкий код, адаптированный под конкретные задачи.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥12431
👨‍💻 Как отличить хороший код от говнокода: руководство для выживания.

Знакомо чувство, когда проект превращается в кошмар из багов и бесконечных правок? Говнокод — это не просто шутка, а реальная проблема, которая рушит продукты и команды. Вот как распознать и избежать его.


Признаки плохого кода:

🔸 Не решает задачу: код может работать без ошибок, но быть бесполезным для бизнеса.
🔸 Код пожирает ресурсы: неэффективность, из-за которой растут затраты на инфраструктуру.
🔸 Непонятная структура: даже автор кода через месяц не разберётся, что он делает и как он работает.
🔸 Копипаст: одинаковые баги в 10 местах, которые нельзя исправить одним правкой.
🔸 Глобальные переменные: скрытые зависимости, которые ломают тесты и логику.
🔸 Отсутствие тестов: изменения становятся лотереей, а релизы — русской рулеткой.


Признаки хорошего кода:

🔹 Читаемость: другой разработчик понимает его с первого взгляда.
🔹 Гибкость: легко добавлять функционал и удалять устаревшие части.
🔹 Минимальные зависимости: изменения в одном модуле не ломают всю систему.
🔹 Тесты: юнит-тесты автоматически проверяют, не сломали ли вы уже работающую функциональность.
🔹 Осмысленные имена: переменные и методы называются так, чтобы не требовались комментарии.


⚠️ Как не скатиться в хаос:

🔹 Код-ревью: обязательная проверка кода перед влитием в основную ветку.
🔹 Стандарты разработки: единый стиль для всей команды (длина строк, переносы скобок, форматирование, нейминг).
🔹 Своевременный рефакторинг: постепенное улучшение вместо переписывания с нуля.
🔹 Тесты для багов: пишем тест перед исправлением, чтобы баг не вернулся.


💡 Вывод:

Хороший код — это не про гениальность, а про дисциплину. Даже под жёсткими дедлайнами можно писать поддерживаемый код, если следовать простым правилам.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
23🔥12👍3🗿11
🔢 Task Local: Как передавать данные между задачами в Swift.

Каждая задача (Task) в Swift может иметь свой собственный контекст — локальные данные, доступные ей и её дочерним задачам. Это похоже на ThreadLocal, но для асинхронных задач.


⚠️ Как это работает:

🔸 @TaskLocal: проперти-враппер, который позволяет шарить данные между задачами.
🔸 withValue: задаёт значение на время выполнения блока кода.
🔸 Наследование: дочерние задачи (async let, TaskGroup) получают копию контекста родителя.

♣️ Пример:


@TaskLocal static var requestID: String?

func fetchData() async {
print("Request ID:", requestID ?? "unknown") // Доступ к контексту
}

Task {
await $requestID.withValue("123") {
await fetchData() // Выведет "123"
}

await fetchData() // Выведет "unknown" так как контекст сброшен
}



🤔 Что под капотом?

🔹 Хранилище: словарь стеков (каждый ключ — свой стек значений).
🔹 withValue пушит значение в стек, defer — удаляет после выполнения.
🔹 Sendable-типы: гарантируют потокобезопасность.


Ограничения:

🔸 Не для больших данных: только для легковесного контекста (ID, флаги).
🔸 Изменяемые объекты: если передаёте класс, изменения будут видны во всех задачах.


💡 Вывод:

Task Local отлично подходит для передачи контекстных данных в асинхронных операциях — например, для логирования ID запросов, управления настройками выполнения или отладки цепочек задач. Главное помнить, что это инструмент для легковесных данных, а не для сложных изменяемых объектов.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
2112👍4🔥2🙏2
🔢 Кэширование в Swift: как сделать приложение быстрее.

Кэширование — мощный инструмент, который почему-то часто упускают из виду. А ведь это идеальное решение для временного хранения данных без лишних запросов к сети или базе.


🤔 Что такое NSCache?

NSCache — встроенный в iOS механизм кэширования, который автоматически освобождает память при нехватке ресурсов. Но есть нюанс: он работает только с классами, наследующими NSObject.

Решение: обертка вокруг NSCache, которая позволяет использовать любые типы данных, включая структуры.


final class Cache<Key: Hashable, Value> {
private let wrapped = NSCache<WrappedKey, Entry>()
// реализация подписки, вставки и удаления
}



⚠️ Жизненный цикл данных.

Чтобы избежать устаревших данных, добавим автоматическую инвалидацию по времени:


struct Entry {
let value: Value
let expirationDate: Date // Удаляем данные после истечения срока
}



💽 Сохранение на диск.

Для оффлайн-доступа к данным расширяем кэш поддержкой Codable и сохраняем в файлы:


extension Cache: Codable where Key: Codable, Value: Codable {
func saveToDisk(name: String) throws {
let data = try JSONEncoder().encode(self)
try data.write(to: cachesDirectory.appendingPathComponent(name))
}
}



Когда это полезно:

🔹 Повторное использование данных (например загруженных товаров в интернет магазине).
🔹 Оффлайн-режим: доступ к последним данным после перезапуска.
🔹 Оптимизация производительности: меньше запросов к серверу.


💡 Вывод:

Кэширование — не просто «сохранить и забыть». Это баланс между скоростью, актуальностью данных и управлением памятью.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
12211👍1🔥11
Технический разбор Max 😎

В канале «Prefire iOS» вышел разбор свежего APK мессенджера Max - и он развеивает многие мифы о «новом и безопасном» приложении.

Что нашли внутри:
- WebRTC для звонков
- ExoPlayer и даже TensorFlow Lite
- следы Odnoklassniki/TamTam (да, привет VK Group 👀)
- и самое главное - никакого E2EE 😬

Без сложных терминов, но с фактами, скринами и кодом.
После такого «прозрачного» взгляда на APK начинаешь совсем по-другому смотреть на работу мессенджеров.

Все подробности и ссылка на Хабр - в посте
🔥10👀5🗿4😁3👍22
👨‍💻 Новый тренд: почему сеньоры притворяются мидлами.

Оказывается, некоторые опытные разработчики сознательно скручивают свой опыт в резюме и устраиваются на несколько мидл-позиций вместо одной сеньорской. Вот главные причины этого тренда:


💵 ЗП-матч: 2 мидла > 1 сеньора.

Две мидл-зарплаты часто превышают доход сеньора, особенно если работать на западные компании. Финансовая выгода очевидна.


Схема тренда:

🔹 Притвориться мидлом на собеседовании.
🔹 Взять задачи под мидла, но делай их со скоростью сеньора.
🔹 Избегать лишних созвонов — говорить что «погружаешься в проект».
🔹 Автоматизировать рутину, использовать ИИ, оценивать задачи в 1.5-2 раза больше по срокам.


⚠️ Меньше ответственности — больше скорости.

На мидл-позициях от тебя не ждут:

🔸 Архитектурных решений.
🔸 Участия в бесконечных созвонах.
🔸 Менторства.
🔸 Высокой ответственности за продукт.

Можно просто брать таски и закрывать их в 2 раза быстрее благодаря реальному опыту.


Подводные камни:

🔸 Придется работать по 10-12 часов в день.
🔸 Риск пересекающихся митингов.
🔸 Постоянное напряжение от двойной игры.
🔸 Возможность выгорания.


💡 Вывод:

Схема работы «сеньор под прикрытием» может принести краткосрочную финансовую выгоду, но требует постоянного стресса, многозадачности и грозит выгоранием. Это тактический ход, а не стратегия карьеры — подходит только тем, кто готов платить за двойную зарплату своим временем и ментальным здоровьем.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀18🔥112👍2😁2🗿1
🇷🇺 🍏 Apple и власти РФ ведут переговоры о запуске RuStore в России.

Происходит историческое событие: компания Apple начала переговоры с российскими властями о возможном размещении отечественного магазина приложений RuStore в App Store. Вот что известно на данный момент:

🔸 Неформальные договорённости уже достигнуты: Apple пообещала не блокировать размещение RuStore.
🔸 Переговоры ведутся при участии Минцифры и главы РФПИ Кирилла Дмитриева.
🔸 Технически это реализуемо: опыт ЕС показал, что альтернативные магазины могут работать на iOS.


⚠️ Нерешенные вопросы:

🔸 Комиссии за установки: как Apple будет получать свою долю за скачивания через RuStore.
🔸 Геоограничения: вероятно, RuStore будет доступен только на территории РФ.
🔸 Техническая интеграция: как будет организован процесс предустановки, установки и обновления приложений.


1 сентября 2025 года — крайний срок для выполнения требований о предустановке российских магазинов приложений на всех смартфонах и планшетах, продаваемых в России.

🔹 В ЕС с марта 2024 года Apple уже позволяет устанавливать альтернативные магазины приложений.
🔹 Российские банки активно заинтересованы в возвращении своих приложений в iOS, так как сейчас они недоступны из-за санкций.
🔹 Технических преград нет, остались юридические и финансовые нюансы.


👨‍💻 Мое мнение:

Я надеюсь, что RuStore скоро появится на iOS, ведь это откроет новые вакансии для разработчиков и даст пользователям долгожданный доступ к банковским и другим приложениям, которые исчезли из App Store из-за санкций.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥10👍5🙏2👏1👀1
🔢 Погружение в диспетчеризацию методов Swift.

Если вы когда-то спорили с коллегами о том, стоит ли помечать классы final для оптимизации производительности, сохраните эту статью. Она разложит все по полочкам.


⚠️ Основные типы диспетчеризации в Swift.

Swift использует два принципиально разных подхода:
🔸 Статическая диспетчеризация: быстрая, но менее гибкая.
🔸 Динамическая диспетчеризация: медленнее, зато поддерживает полиморфизм.

Динамическая диспетчеризация может негативно влиять на производительность из-за:
🔸 Потери возможности оптимизации кода.
🔸 Увеличения вероятности кэш-промахов CPU.
🔸 Накладных расходов на поиск метода в таблицах.

Ключевой момент: если компилятор может определить адрес метода на этапе компиляции — используется статическая диспетчеризация. Иначе динамическая.


1️⃣ Статическая диспетчеризация.

Встраивание (Inlining):

Компилятор может заменить вызов функции ее телом, чтобы избежать накладных расходов.

♣️ Пример:


func square(_ x: Int) -> Int {
return x * x
}

let result = square(5)

// После оптимизации компилятор может превратить это в:
let result = 5 * 5 // 25 (вычислено на этапе компиляции!)


Прямая диспетчеризация (Direct Dispatch):

Используется для:
🔹 Структур.
🔹 Перечислений.
🔹 final классов.
🔹 static и private методов.

Почему это быстро?
Адрес метода известен заранее: CPU выполняет его за одну инструкцию.


2️⃣ Динамическая диспетчеризация.

Табличная (Virtual Table):

Каждый класс хранит таблицу методов. При вызове:
🔹 CPU ищет адрес метода в таблице.
🔹 Переходит по нему.

♣️ Пример:


class Animal {
func sound() {
}
}

class Dog: Animal {
override func sound() {
}
}

let pet: Animal = Dog()
pet.sound() // Динамически выбирается Dog.sound()



Протокольная (Witness Table):

Аналогично табличной, но для протоколов:


protocol Drawable {
func draw()
}

struct Circle: Drawable {
func draw() {
}
}

let shape: Drawable = Circle()
shape.draw() // Вызов через witness table



3️⃣ Message Dispatch (Obj-C Runtime).

Самая гибкая, но медленная диспетчеризация через Objective-C runtime:


class MyClass: NSObject {
@objc dynamic func message() {
}
}
// Вызов через objc_msgSend


Особенности:
🔹 Позволяет модифицировать поведение методов в runtime (swizzling).
🔹 Используется для KVO, Core Data и совместимости с Objective-C.


Известные проблемы диспетчеризации.

🔸 Проблема 1:


protocol P {
}

extension P {
func foo() {
print("Protocol")
}
}

class A: P {
func foo() {
print("Class")
}
}

let instance = A()
instance.foo() // Выведет: Class, динамическая диспетчеризация

let instance2: P = A()
instance2.foo() // Выведет: Protocol, статическая диспетчеризация


Решение проблемы:

protocol P {
func foo() // Добавили метод в протокол
}

extension P {
func foo() {
print("Protocol")
}
}

class A: P {
func foo() {
print("Class")
}
}

let instance = A()
instance.foo() // Выведет: Class, динамическая диспетчеризация

let instance2: P = A()
instance2.foo() // Выведет: Class, динамическая диспетчеризация


🔸 Проблема 2:


protocol P {
func foo()
}

extension P {
func foo() {
print("Protocol")
}
}

class A: P {
}

class B: A {
func foo() {
print("Class")
}
}

let instance = B()
instance.foo() // Выведет: Class

let instance2: A = B()
instance2.foo() // Выведет: Protocol


Решение проблемы:

protocol P {
func foo()
}

extension P {
func foo() {
print("Protocol")
}
}

class A: P {
func foo() { // Нужно реализовать метод
}
}

class B: A {
override func foo() {
print("Class")
}
}

let instance = B()
instance.foo() // Выведет: Class

let instance2: A = B()
instance2.foo() // Выведет: Class



💡Вывод:

Используйте final и private там, где это возможно, чтобы компилятор мог оптимизировать код. Динамическая диспетчеризация — мощный инструмент, но не всегда нужен. Баланс между гибкостью и производительностью — ключ к эффективному коду.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
20🔥16👍2🙏1🫡11
🔢 Гайд по промптингу для Apple Foundation Models.

Новые Foundation Models от Apple — это не просто ещё один ИИ, а специально обученная модель для работы со Swift и SwiftUI. Рассказываю, как правильно с ней общаться.


⚠️ Особенности модели:

🔸 Очень маленький контекст: всего 4096 токенов на всё (и вход и выход).
🔸 Жесткие ограничения безопасности: много ложных срабатываний.
🔸 Заточена под генерацию Swift-структур через Generable.
🔸 Работает полностью на устройстве: не нужен интернет.


🤔 Как тестировать промты?

Просто создайте Playgrounds.swift в проекте и экспериментируйте:


import Playgrounds

#Playground {
// Тестируйте промты здесь
let prompt = "Напиши функцию на Swift"
}



💎 Ключевые техники:

🔹 Guided Generation: используйте макрос Generable для чёткой структуры ответа.
🔹 Порядок свойств: ИИ генерирует последовательно, поэтому важные поля ставьте первыми.
🔹 Указание длины: пишите «подробно», «кратко», «три предложения» для контроля объёма.


⚙️ Настройки генерации:

🔹 temperature: 0.8 — более креативные ответы.
🔹 sampling: .greedy — детерминированные и предсказуемые.
🔹 maxTokens: 1000 — ограничение длины ответа.


🛡 Безопасность и ошибки:

🔹 Всегда обрабатывайте ошибки LanguageModelError.
🔹 Пользовательский ввод может триггерить защитные механизмы.
🔹 Имейте fallback-стратегии на случай блокировок.


Главные преимущества:

🔹 Нативная интеграция со Swift.
🔹 Не нужно парсить JSON: работаете напрямую с объектами.
🔹 Мгновенное тестирование без API-вызовов.
🔹 Полная конфиденциальность: всё на устройстве.


💡 Вывод:

Apple Foundation Models — это не просто ещё один инструмент ИИ, а качественно новый подход к разработке. Модель, специально обученная для работы со Swift и SwiftUI, позволяет интегрировать интеллектуальные функции напрямую в код — без сложных API, JSON-парсинга и внешних зависимостей. Всё работает локально, безопасно и с полной интеграцией в экосистему Apple.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍1341👀1
🤖 Vibe-coding vs Prompt-engineering: два подхода к работе с ИИ.

Опытные разработчики чаще принимают ИИ-инструменты, чем новички. Возможно, дело в уверенности: сеньоры не боятся что их заменят, а видят в ИИ помощника.


1️⃣ Vibe-coding.

Как работает:
Бросаешь задачу в ChatGPT (или другие ИИ), получаешь готовый код и слегка его правишь.

Проблема:
Нет глубокого понимания кода, ментальная модель не строится.

Когда использовать:
Только для быстрых прототипов и экспериментов.

Риски:
Код может быть неоптимальным и со скытыми багами.


2️⃣ Prompt-engineering.

Как работает:
Тщательно проектируешь запросы, задаешь контекст, формат и ограничения, получаешь точный результат.

Преимущество:
Полный контроль над процессом, понимание каждой строки кода.

Идеально для:
Рутинных задач, шаблонного кода и документации.

Аналогия:
Как менторить джуна: даешь четкие инструкции и проверяешь результат.


⚠️ Ключевое отличие:

Vibe-coding: эмоциональный подход «сгенерируй что-нибудь».
Prompt-engineering: инженерный подход «дай мне конкретное решение под мои требования».


Как использовать ИИ эффективно:

🔹 Всегда включать голову: не важно откуда код: из ИИ, Stack Overflow или из статьи.
🔹 Дробить задачи: давать ИИ конкретные мелкие задания вместо «сделай все».
🔹 Тестировать и проверять: любой сгенерированный код требует ревью и тестов.
🔹 Учиться формулировать: прокачивать навык написания четких промтов.


💡 Вывод:

ИИ не замена разработчику, а мощный инструмент. Как молоток: можно собрать мебель, а можно разбить палец. Все зависит от того, кто и как его использует.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍221512🔥3🤔1🙏1
👨‍💻 IT-кризис: почему айтишники стали одними из самых безработных.

Шокирующая статистика из США: каждый 15-й молодой IT-специалист сейчас без работы. Среди программистов уровень безработицы достигает 7.5% — это выше, чем у гуманитариев и биологов!


🤔 Что происходит?

🔸 Массовые сокращения в гигантах типа Amazon, Microsoft и Intel.
🔸 Вакансий для джунов стало на 21% меньше.
🔸 Нейросети забирают задачи новичков: код-ревью, тестирование, шаблонный код.
🔸 Переизбыток выпускников: 170K дипломов за год (вдвое больше чем 10 лет назад).


⚠️ Глубинные причины:

🔸 Индустрия повзрослела: меньше стартапов, больше поддержки легаси.
🔸 Смещение фокуса на senior-специалистов вместо массового найма джунов.
🔸 ИИ-революция: ChatGPT и Copilot заменяют начинающих разработчиков.
🔸 Постковидная коррекция: переоценка штата после бума удалёнки.


Что делать начинающим:

🔹 Прокачивать уникальные навыки, а не только один язык программирования и фреймворк.
🔹 Собирать портфолио: пет-проекты, фриланс с реальными кейсами.
🔹 Рассматривать смежные области, которые пока еще не заменит искусственный интеллект.


💡 Вывод:

Рынок труда для новичков в IT серьёзно изменился. Теперь недостаточно просто закончить курсы, нужно предлагать реальную ценность и адаптироваться к новым реалиям.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👀10🤯52🤔1🙏1🗿1
Работаем с таймерами через AlarmKit: новый фреймворк Apple.

На WWDC 2025 представили AlarmKit — фреймворк для создания будильников и таймеров, которые работают даже в беззвучном режиме и при активном Focus. В отличие от обычных уведомлений, AlarmKit всегда показывает баннер и воспроизводит звук!


1️⃣ Запрос разрешения.

Добавим в Info.plist ключ NSAlarmKitUsageDescription с описанием, зачем приложению нужны таймеры. Затем запросим авторизацию:


import AlarmKit

let manager = AlarmManager.shared
let state = try await manager.requestAuthorization()



2️⃣ Настройка таймера.

Создадим кастомизированный алерт и атрибуты:


let alert = AlarmPresentation.Alert(
title: "Готово!",
stopButton: AlarmButton(text: "Готово", systemImageName: "checkmark")
)

let attributes = AlarmAttributes<TimerData>(
presentation: AlarmPresentation(alert: alert),
tintColor: .blue
)

let timer = try await manager.schedule(
id: UUID(),
configuration: .timer(duration: 30, attributes: attributes)
)



3️⃣ Live Activity и Dynamic Island.

Добавим виджет для отображения обратного отсчета на экране блокировки и в Dynamic Island:


// В виджете:
Text(timerInterval: Date.now...countdown.fireDate)
.monospacedDigit()



4️⃣ Список активных таймеров.

Использование alarmUpdates для отслеживания состояния:


for await alarms in AlarmManager.shared.alarmUpdates {
// Обновляем список таймеров
}



⚠️ Практические советы.

🔹 Всегда проверяйте статус авторизации authorizationState перед планированием.
🔹 Используйте кастомные метаданные через AlarmMetadata для передачи дополнительной информации.
🔹 Для паузы/возобновления используйте методы pause() и resume().
🔹 Обрабатывайте ошибки отмены через try-catch.


Важные ограничения.

🔸 Максимальное количество активных будильников: 50 на устройство.
🔸 Минимальная длительность таймера: 1 секунда.
🔸 Максимальная длительность: 23 часа 59 минут 59 секунд.


💡 Вывод:

AlarmKit — мощный инструмент для создания надежных таймеров, но требует настройки нескольких компонентов. Идеально для кулинарных таймеров, напоминаний и любых приложений, где важно точное время.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2075🔥2🙏1
👨‍💻 Ускоренная проверка приложений в App Store: как это работает.

Знаете ли вы, что можно ускорить модерацию приложения в App Store? Рассказываю про официальный способ от Apple - Expedited App Review.


⚠️ Как это работает:

🔸 Заполняете форму на сайте Apple Developer.
🔸 Уже через 15 минут приложение переходит в статус «На проверке» (вместо стандартных 1-3 дней!).
🔸 В среднем за 25-30 минут проверка завершается и приложение готово к релизу.


Особенности:

🔹 Автоповтор: если билд отклонили, следующий билд с исправлением проблемы автоматически пройдет ускоренную проверку.
🔹 Без лишних вопросов: не нужно объяснять причину (но лучше иметь вескую).
🔹 Работает для обновлений: не только для новых приложений, но и для апдейтов.
🔹 Срочные фиксы: идеально подходит для критических багов или срочных юридических требований.
🔹 Только для отправленных билдов: ускоренной обработке подлежат только те заявки, которые уже были отправлены на обычную проверку в App Store Connect.


Ограничения и минусы:

🔸 Не для частого использования: Apple рекомендует использовать не более 1-2 раз в год.
🔸 Могут отказать: если сочтут причину недостаточно веской (письмо придет на почту).
🔸 Не для всех случаев: не подходит для обычных обновлений без срочности.
🔸 Риск израсходовать возможность: при злоупотреблении могут временно заблокировать доступ к данной функциональности.


⚙️ Как отправить заявку:

🔹 Перейдите на страницу связи с поддержкой Apple Developer.
🔹 Выберите App Review, затем Expedited App Review Request.
🔹 Заполните форму.
🔹 Отправьте и ждите результата.

Так же, можно сразу перейти на страницу Expedited App Review по ссылке.


💡 Вывод:

Expedited App Review - отличный инструмент для критических ситуаций, но не стоит использовать его для каждого обновления.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍82🔥1🙏1
👨‍💻 Реальная жизнь айтишника: не только код и кофе.

Многие думают, что программисты целый день пьют кофе и иногда пишут код. На самом деле всё сложнее и я расскажу, как сохранить продуктивность и не выгореть.


Утро: запускаем мозг правильно.

Не стоит сразу садиться за ноутбук, сначала нужно правильно настроиться на работу. Вот что может помочь:
🔹 Контрастный душ или хотя бы обычный, это поможет проснуться лучше чем кофе.
🔹 Стакан воды и легкая зарядка.
🔹 Свежий воздух (открытое окно или короткая прогулка).
🔹 Спокойный завтрак без смартфона (без ленты новостей и рабочих чатов).


🏢 Офис vs удаленка: где лучше?

В офисе:
Легче синхронизироваться с командой.
Четкие границы рабочего времени.
Требует времени на дорогу и подготовку.

Дома:
Лучше для глубокой концентрации.
Гибкий график.
Нужна самодисциплина и отдельное рабочее место.


🗓 Как организовать рабочий день:

🔹 Программирование занимает только ~50% времени.
🔹 Остальное: созвоны, обсуждения, планирование.
🔹 Делайте перерывы каждые 1.5-2 часа.
🔹 Вставайте из-за стола, пройдитесь, разомнитесь.


⚠️ Опасность ночной работы:

Работа ночью кажется продуктивной, но это иллюзия:
🔸 Критическое мышление отключается первым.
🔸 Код получается сложным и запутанным.
🔸 На исправление ошибок уходит в 3 раза больше времени.


🏃‍♂️ Баланс и хобби:

🔸 Обязательно занимайтесь спортом или физической активностью.
🔸 Выбирайте хобби, не связанные с компьютером.
🔸 Живое общение с друзьями лучше соцсетей.
🔸 Не работайте в выходные — это путь к выгоранию.


❤️ Главные правила:

🔹 Работайте в рабочее время.
🔹 Отдыхайте без чувства вины.
🔹 Двигайтесь, сидячий образ жизни убивает.
🔹 Находите время для себя и близких.


💡 Вывод:

Успешный айтишник не тот, кто кодит 24/7, а тот кто умеет грамотно организовать свой день, отдыхать и сохранять баланс.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥174👍21
👨‍💻 Vibe code cleanup specialist: новая профессия в эпоху ИИ.


С появлением нейросетей в программировании возник неожиданный тренд — всё чаще требуется не просто сгенерировать код, а довести его до ума. Так родилась новая роль: Vibe code cleanup specialist — специалист, который превращает сырой ИИ-код в чистый, поддерживаемый и эффективный код.

Эти эксперты уже активно предлагают свои услуги на фриланс-биржах и даже добавляют этот навык в резюме. Их задача — не просто исправить ошибки, но и улучшить читаемость, оптимизировать производительность и адаптировать код под стандарты проекта.

По сути, ИИ не заменяет разработчиков, а создаёт новые ниши: кто-то учится писать промпты, кто-то делает инструменты для работы с нейросетями, а кто-то специализируется на «чистке» кода.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1432🔥1🙏1👀1
📱 Как устроена работа с камерой в iOS: краткий разбор.

Разберем ключевые компоненты AVFoundation для работы с камерой: от подключения устройств до преобразования сырых данных в готовое изображение. Поймем разницу между AVCapturePhoto, CGImage и SwiftUI Image


🧩 Основные компоненты:

🔸 Input: устройство, которое может передавать видео, фото или аудио. Например задняя камера, фронтальная камера или встроенный микрофон.
🔸 Output: фактический вывод устройства. Это может быть фото или видео сохраненные на диске. Либо обработанный вами объект. Например: обнаруженные лица, отсканированные штрихкоды или примененные фильтры.
🔸 Preview: вывод изображения с камеры.
🔸 Stream: непрерывный поток кадров. Обычно вы снимаете один кадр как фотографию или серию кадров как видео. Хотя современные камеры часто объединяют кадры из-за слабого освещения, уменьшения шума и т. д. Поток также доступен для предварительного просмотра.
🔸 Session: объект, предоставляющий интерфейс для добавления/удаления входов и выходов, а также настройки конфигурации сеанса. Позволяет начинать и завершать сеанс.


⚠️ Важные нюансы:

🔸 Захват фото: асинхронный: метод capturePhoto не возвращает фото сразу — камере нужно время на фокусировку, экспозицию и, возможно, вспышку.
🔸 Разное качество: фото захватываются в максимальном разрешении, а превью — в низком для плавности.


🗃 Типичный поток данных:


Камера -> AVCapturePhoto -> Декодирование -> CGImage -> Image (SwiftUI) -> отображение на экране


Либо сохранение в Фото -> PHAsset (ссылка на медиатеке).


💎 Ключевые различия форматов:

🔹 AVCapturePhoto: сырые данные с камеры (ещё не отображенные).
🔹 PHAsset: ссылка на фото/видео в медиатеке (не содержит пиксели).
🔹 CGImage: растровое изображение (можно рисовать).
🔹 Image (SwiftUI): view для отображения.


💻 Тестирование:

🔹 На iOS-симуляторе камера не работает, поэтому лучше тестировать на реальном устройстве.
🔹 На macOS можно тестировать через встроенную камеру Mac.


💡 Вывод:

AVFoundation — мощный, но сложный фреймворк. Главное — понять роль каждого компонента и их взаимодействие.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1543👍1👏1👀1🤝1
🔢 Что нового в UIKit для iOS 26: главные фичи.

В iOS 26 UIKit получил множество обновлений, которые упрощают разработку и добавляют новые возможности. Вот основные изменения:


🎨 UIGlassEffect.

Liquid Glass — главная фишка iOS 26:
🔹 UIGlassEffect: стильные стеклянные эффекты Liquid Glass с настройкой цвета и интерактивности.
🔹 UICornerConfiguration: гибкое управление скруглением углов (вплоть до адаптивных под форму экрана).
🔹 Обновлённые UIBarButtonItem: новые стили, бейджи и улучшенная анимация между навигационными панелями.


📝 UITextField и UITextView.

🔹 В UITextField появились новые методы для поддержки функции Natural Selection:
— textField(_:shouldChangeCharactersInRanges:replacementString:) заменяет старый метод.
— textField(_:editMenuForCharactersInRanges:suggestedActions:) также обновлён.
🔹 UITextView теперь использует selectedRanges вместо selectedRange, что улучшает работу с текстом, содержащим смешение направлений (LTR и RTL).


🖼️ Работа с цветом.

🔹 HDR-цвета в UIColor: поддержка высокого динамического диапазона с контролем экспозиции.
🔹 Обновлённый UIColorPickerViewController: слайдер для настройки HDR и опция отключения пипетки.


📱 Навигация и интерфейс.

🔹 UINavigationItem теперь поддерживает:
— Attributed-заголовки и подзаголовки.
— Кастомные subtitleView и largeSubtitleView.
— Гибкое размещение searchController (в навигационной панели или тулбаре).
🔹 Интерактивное закрытие: свайп для возврата (работает даже со скрытой кнопкой назад).

🎛 Split View и Inspector.

🔹 Новая колонка Inspector в UISplitViewController: для боковых панелей в стиле macOS.
🔹 Гибкая настройка ширины: минимальные/максимальные значения для secondary и inspector колонок.


🔄 UIAction и UIApplicationDelegate.

Добавлены новые идентификаторы действий, а также постепенно происходит переход от UIApplicationDelegate к UISceneDelegate и UIWindowSceneDelegate.


👔 Обновлённые компоненты.

🔹 UISlider: новые стили (включая бесползунковый) и гибкая настройка трека с тиками.
🔹 UITabBarController: bottomAccessory для плавающих панелей (как в Music).
🔹 Свертывание таббара: автоматическое скрытие при прокрутке.


⚙️ Технические улучшения.

🔹 Наблюдение за свойствами: автоматический трекинг изменений в @Observable объектах.
🔹 Анимации: новый параметр .flushUpdates для автоматического обновления констрейнтов.
🔹 Безопасная область: новый LayoutRegion с учётом скруглений экрана и системных элементов.


⚠️ Важно:

🔸 Многие deprecated-методы UIApplicationDelegate перенесены на UISceneDelegate.
🔸 Улучшена поддержка правого-налево и смешанного текста (Natural Selection).
🔸 VisionOS: сохранение окон в пространстве и опции их автоматического удаления.


Это лишь часть изменений, но уже очевидно, что iOS 26 делает UIKit мощнее и удобнее для разработчиков.


💡 Вывод:

UIKit всё ещё жив и активно развивается, особенно в области кастомизации, HDR и адаптации под новые форм-факторы.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥44👍1🤝1
👨‍💻 Зачем разработчику софт-скиллы?

Знакомо чувство, когда кажется, что твоя работа просто писать код, а все остальное (бизнес-логика, коммуникация, командная работа) должно волновать кого-то другого? Давайте разберемся, почему это опасное заблуждение.


⚠️ Реалии рынка:

🔸 Компаниям нужны команды, а не гении-одиночки. 90% проектов требуют слаженной работы, а не гениального кода одного человека.
🔸 Токсичных спецов терпят только до первого кризиса. Да, есть в ИТ «вундеркинды», которые тянут весь проект самостоятельно, но их карьера коротка и непредсказуема.
🔸 Без софт-скилов вас просто не возьмут. Даже джунам теперь нужны базовые навыки коммуникации.


🤔 Почему софт-скиллы так важны?

🔸 Понимание бизнеса = более верные решения, меньше багов и переделок.
🔸 Коммуникация = умение вовремя донести проблему и правильно понять суть задач.
🔸 Спокойствие и адекватность = меньше конфликтов и токсичности, больше продуктивности.


Как прокачать софт-скиллы?

🔹 Учитесь слушать. Часто проблема не в том, что вы не умеете говорить, а в том, что не слышите других.
🔹 Задавайте вопросы. Лучше уточнить, чем неделями чинить неправильную задачу.
🔹 Обратная связь. Учитесь давать ее корректно и принимать без обид.
🔹 Минимум токсичности. Даже простое «спасибо» в чатах улучшает атмосферу в команде.
🔹 Практикуйте простое объяснение. Если вы можете объяснить задачу так, чтобы понял стажер, значит вы ее и сами хорошо понимаете.


💡 Вывод:

Хороший разработчик нужен всегда, но хороший программист с софт-скилами ценится в разы выше. Такой разработчик быстрее растет, чаще получает интересные задачи и становится тем, кого зовут в проекты снова и снова.


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
146👍4🔥1🤯1👀1
🔨 Как подключить Google Gemini к Xcode 26.

Официально в Xcode 26 нельзя просто добавить Gemini, но есть лайфхак с прокси! Рассказываю, как заставить их работать вместе.


В чём проблема:

Xcode ожидает API с классической структурой URL (/v1/...), а у Gemini путь другой — /v1beta/openai/. Но это решаемо!


1️⃣ Добавляем провайдер в Xcode.

Открываем настройки (Settings), Intelligence, Add Model Provider:

Type: Internet Hosted

URL: https://generativelanguage.googleapis.com/

API Key: Bearer YOUR_API_KEY

API Key Header: Authorization

Description: Gemini (или как хотите)


Сохраняем и закрываем Xcode.


2️⃣ Настраиваем прокси.

Скачиваем Proxyman (или другой) и настраиваем перехват запросов от Xcode. После чего добавляем скрипт для подмены URL:


function onRequest(context, url, request) {
request.path = request.path.replace("/v1/", "/v1beta/openai/");
return request;
}


Этот скрипт автоматически исправит пути запросов на лету.


3️⃣ Проверяем работу.

Запускаем Proxyman, затем открываем Xcode, настройки, Intelligence. Видим список моделей Gemini (если всё настроено верно).


4️⃣ Используем в работе.

Пишем как обычно, Xcode будет отправлять запросы через прокси к Gemini. Например: «Добавь кнопку и переведи интерфейс на английский» и код генерируется!


⚠️ Особенности:

🔸 Proxyman должен быть запущен во время работы с Xcode.
🔸 Цена вопроса: Gemini дешевле многих аналогов ($0.125 за 1M токенов).
🔸 Качество: Gemini 2.5 Flash показывает отличные результаты в код-генерации.


Теперь можно использовать Gemini прямо в Xcode 🚀


➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1622🔥1👀1🤝1