Обновить

Мобильная разработка

Сначала показывать
Порог рейтинга

Императивное, декларативное и генеративное программирование.

Создатели фреймворка SwiftUI всегда подчёркивают, что он создан на основе парадигмы декларативного программирования. В отличие от предыдущего фреймворка UIKit, который характеризуется как пример императивного программирования.

Когда речь заходит о том, чем императивное программирование отличается от декларативного, то объяснение чаще всего сводится к тому, что при декларативном программировании разработчику нужно просто сказать, что ему нужно и SwiftUI это сделает. А если используется UIKit, то здесь типа надо все сделать самому.

Честно говоря, не очень внятное объяснение, поэтому попробую описать это различие сам на одном примере.

Итак, если в UIKit нам нужно вывести на экран список элементов, то мы используем TableView или CollectionView, которые уже подписаны на 2 протокола, а затем должны реализовать 3 метода: количество секций, количество строк в секциях, и в третьем методе скомпоновать ячейку и прописать загрузку в неё данных.

Та же задача в SwiftUI решается следующим образом:

List(items) { item in
Text(
item.name) }

Т.е., меньше кода, меньше времени тратится на реализацию задачи.

Можно, конечно, называть это декларативным программированием. Но можно считать это и следующим этапом развития высокоуровневого программирования. Когда-то программисты писали машинный код, потом языки программирования становились все более высокоуровневыми, все более понятными человеку. И вот теперь наступил новый этап, когда программирование стало ещё более высокоуровневым. Уже можно использовать более короткие высокоуровневые инструкции.

Наконец, самое интересное, что с этой же точки зрения можно рассматривать и программирование с помощью ИИ. Т.е., в тех же UIKit и SwiftUI, и в других языках программирования, разработчик пишет инструкции техническим языком, которые понятны в основном ему как человеку, но не очень понятны обычным людям. А теперь, в промтах, можно использовать уже и не технические инструкции.

Например, уже даже не надо писать команду List и т.д., а достаточно сказать ИИ "сделай список из таких-то элементов".

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

И поскольку ИИ везде называют генеративным, а его действия по написанию текстов, кода, созданию изображений и т.д., как генерация, то этот этап высокоуровневого программирования тоже можно назвать генеративным.

В итоге, получаем такую триаду:

  • Императивное программирование

  • Декларативное программирование

  • Генеративное программирование

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии2

Смотрите WWDC 2025 вместе с Surf и участвуйте в розыгрыше 🎧

Готовы к WWDC? Подключайтесь к нашей трансляции 9 июня в 20:00 по Москве. В прямом эфире мы вместе с сёрферами разберём главные анонсы и свежие решения Apple. Ожидается много интересного: от революционных обновлений iOS 26 и macOS 26 до новинок в мире ИИ-технологий от Apple.

Присоединяйтесь к нашему обсуждению. На стриме будут Head of Flutter Surf, Евгений Сатуров, и наши опытные iOS-разработчики — Кирилл и Антон. Они поделятся своим экспертным мнением о свежих решениях Apple. Будем активно общаться в чате, делиться впечатлениями и мнениями о презентации.

А чтобы было еще интереснее смотреть, мы разыграем на трансляции AirPods 4. Все подробности об этом здесь: https://surftech.timepad.ru/event/3397366/

Подключайтесь к стримам 9 июня. Запись сохраним:

  • VK Видео: vk.cc/cMuWI5

  • YouTube: vk.cc/cMuWJL

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

У ChatGPT появилась память

Сегодня ChatGPT встречает своих пользователей сообщением о том, что у него теперь есть память. Т.е., он теперь помнит содержание чатов.

И в качестве демонстрации своих нынешних способностей он выдал мне характеристику на основе наших с ним чатов.

Надо сказать, довольно занимательное чтение увидеть себя с его стороны.

Теги:
Всего голосов 4: ↑3 и ↓1+3
Комментарии3

Apple шпионила за пользователями с помощью Siri

Вы замечали, что после обсуждения кафешки на iPhone появляется соответствующая контекстная реклама? Слухи об этом ходили давно, но не все знают, как далеко это зашло.

Apple признала, что не только анализировала разговоры пользователей Siri в автоматическом режиме, но и передавала их сторонним подрядчикам для повышения качества. Компания отрицает использование записанных разговоров в целях рекламы, но кому легче, если любой ваш разговор мог быть прослушан неизвестными. Какие выводы можно сделать?

Общая сумма штрафа составила 95 млн долларов. Пользователи могут заполнить форму иска на сайте и получить до 20 долларов за каждое устройство, на котором Siri могла прослушивать их. Сделать это могут только пользователи из США, так что для нас это скорее не возможность получить деньги, а совсем другие уроки.

Производители могут сколько угодно говорить о приватности, но будут нарушать собственные обещания в погоне за новой функциональностью и, соответственно, новыми прибылями. При этом будут отделываться несущественными штрафами: 95 млн — это 0,1% от чистой прибыли компании за 2024 год. То есть штраф несущественный, есть прямой смысл дальше продолжать экспериментировать с пользовательскими данными.

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

Противостоять этому можно только не забывая ни на минуту: всё может утечь. Если уж вам дороги пикантные моменты, храните их на диске, не подключённому к сети. Если не можете обойтись без пересылки паролей — заведите менеджер паролей, включите многофакторную аутентификацию и разбивайте информацию, отправляйте её по разным каналам. А лучше всё-таки начните с базового правила информационной безопасности — никогда не передавайте в открытом виде пароли (голос тоже считается). То же самое с ценной для вас информацией.

Увы, цифра коварна, она даёт нам непредставимые новые возможности. Но при этом без зазрения совести использует нашу частную информацию, чтобы стать ещё лучше и сильнее.

Теги:
Всего голосов 19: ↑19 и ↓0+30
Комментарии4

Опыт использования Claude для написания готового приложения

Ну вот и я сподобился - написал приложение полностью на Claude.

Приложение на SwiftUI, не enterprise, но достаточно сложное, из категории Favorite.

Начал на Claude Sonnet 3.7, потом вышел 4, закончил на нем.

Всего 1156 строк кода и без ошибок!

Естественно было несколько итераций. Причём практически все - это уточнение промта.

Кода он наворотил много, по мне так можно было и проще. Но он уж развернулся по полной - структуры, классы, вью, перечисления, состояния, published, state и т.д. и т.п.

Как оно там внутри вертится крутится даже не смотрел. Главное - работает и этого достаточно.

В общем, впечатлён. Не ожидал. Предполагал, что будут ошибки, заторы, что придётся с ними разбираться. Ан нет, все зашло без глюков, с первого раза.

Теги:
Всего голосов 7: ↑1 и ↓6-3
Комментарии15

Магазину приложений RuStore исполнилось три года. Количество установок этого приложения на устройствах пользователей превысило 100 млн.

25 мая 2022 года VK при поддержке Минцифры запустила открытое бета‑тестирование отечественного магазина мобильных приложений для Android под названием RuStore.

В начале февраля 2023 года RuStore объявил о завершении этапа бета‑тестирования магазина приложений. Также создатели платформы перевели интерфейс консоли разработчика на английский язык для удобства иностранных издателей и партнёров.

В декабре 2024 года месячная аудитория магазина приложений RuStore составила 50 млн пользователей старше 12 лет по всей России, согласно исследованию Mediascope. Аудитория Xiaomi Mi Store составила 19 млн, Samsung Galaxy Store — 14 млн, HUAWEI AppGallery — 10 млн, рассказали Хабру в пресс‑службе RuStore. А в Минцифры заявили, что RuStore от VK обошёл по числу пользователей в России App Store от Apple.

В VK добавили, что в каталоге RuStore уже более 50 тысяч приложений, доступных на ОС Android, Harmony OS и «Аврора», от разработчиков из 40 стран мира. Также вышли версии RuStore для электронных книг и умных телевизоров, для проекторов, Hi‑Fi‑аудиоплееров, игровых консолей, кассовых терминалов, умных часов.

Теги:
Всего голосов 6: ↑2 и ↓40
Комментарии9

Основатель мессенджера Павел Дуров сообщил, что Telegram поднялся на восьмое место в рейтинге самых скачиваемых приложений в первом квартале 2025 года.

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии0

Почему мы разлюбили Isar

Isar — это NoSQL база данных, которую когда-то разработали создатели Hive. Про все плюсы этой БД мы уже писали. Однако однажды нашей Flutter-команде достался проект, который заставил их в корне изменить отношение к Isar и отказаться от этой технологии раз и навсегда.

Это было приложение для аграриев — то есть буквально для людей, которые работают в полях. Грубо говоря, оно помогало фермерам следить за состоянием угодий: например, проверять, что уже обработано от колорадского жука, а что пока не обработано. В общем, полезная штука для очень понятной целевой аудитории.

Но специфика приложения накладывала на нас и вполне себе конкретные технические требования: оно должно было бесперебойно работать в офлайне — поля всё-таки бывают далековато от вышек мобильных операторов. Для реализации офлайн-режима как раз и был выбран Isar — это решение казалось удобным.

Как же мы ошибались! Так как у приложения был офлайн-режим, на старте оно загружало большие объемы данных, среди которых, например, было гигантского видео. И это создавало проблемы. В приложении добавлялись новые справочники, но документации на миграцию в Isar не было. К тому же на Android 32-ой архитектуры в базе вылезли баги.

Как исправить эти нюансы, мы не поняли. Писали письма разработчикам Isar, смотрели, что пишут об этом в сообществах. Но в итоге махнули рукой: решили всё переписать на SQL. Выбрали Drift, так как уже имели опыт работы с ним. Взяли уже готовый интерфейс и добавили его в приложение. Вскоре поняли, что Drift отвечает нашим запросам. Isar же использовать в проектах больше не планируем.

Кстати, этот проект в целом оказался судьбоносным для нашей команды Flutter. Какие еще уроки они вынесли после работы над приложением — в отдельной статье.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

$10,1 млрд заработала Apple на комиссиях в App Store с американских разработчиков, говорится в исследовании Appfigures. По оценкам компании, в 2024 году американские разработчики заработали в App Store $33,68 млрд, но после уплаты комиссии Apple их доход сократился до $23,57 млрд.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Google I/O 2025: два вечера главных анонсов вместе с Surf

20 и 21 мая — подключайся к нашим стримам по Google I/O. Будем вместе следить за анонсами новинок, делиться первыми впечатлениями и обсуждать всё самое интересное из мира технологий и разработки в прямом эфире.

Смотрим и комментируем:

  • 20 мая (вторник)
    → 20:00 — Google Keynote: все главные анонсы и будущее технологий от Google.

  • 21 мая (среда)
    → 20:00 — What’s new in Android development tools: новинки для Android-разработчиков.
    → 21:00 — What’s new in Flutter: свежие обновления для Flutter-сообщества.

Время указано по Москве. Позже добавим сюда наших спикеров и персональные ссылки на трансляции.

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

Теги:
Рейтинг0
Комментарии0

Как работать с реактивным кодом в iOS на примере Combine

Пожалуй, каждый iOS-разработчик видел в требованиях вакансий «знание фреймворков RxSwift, RxCocoa». Эти инструменты основаны на концепции реактивного программирования.

Реактивное программирование, как следует из названия, основано на реакции на событие: пользователь взаимодействует с интерфейсом и ждёт реакцию от приложения. Этот подход популярен в фронтенд-разработке, в том числе на iOS.

Мы в Surf долгое время избегали «реактивщины» в приложениях. Во-первых, это лишние зависимости. Во-вторых, подобные библиотеки несут в себе не только преимущества, но и проблемы с дебагом, сложностью поддержки кода и так далее.

Однако с выходом Combine и SwiftUI, мы решили начать внедрять реактивный подход в наши приложения. Благо, теперь не нужны сторонние решения: хватит того, что предоставляет Apple. Давайте посмотрим, как можно работать с реактивным кодом.

Главные элементы Combine, с которыми происходит работа:

1) Publisher — издатель

Протокол, указывающий, что тип может передавать последовательность значений со временем. Publisher предоставляет данные только подписчику (Subscriber) и делает это, когда данные становятся доступны. Без подписки Publisher не активен.

Publisher описывается двумя ассоциированными типами: <Output, Failure>

  • Output — тип выдаваемых значений

  • Failure — тип возможной ошибки. Если ошибок быть не может, используется Never.

2) Subscriber — подписчик

Отвечает за запрос и получение данных от издателя, а также за обработку ошибок.
Имеет типы <Input, Failure>:

  • Input — тип входных данных

  • Failure — тип ошибки

Subscriber сам инициирует запрос и управляет объёмом поступающих данных. Основные способы обработки:

  • sink(receiveCompletion:receiveValue:)Принимает два замыкания: первое вызывается при завершении (успешно или с ошибкой); второе — при получении значений.

  • assign(to:on:)Присваивает полученные значения свойству объекта по keyPath.

3) Operators — операторы

Методы, преобразующие данные и потоки. Операторы — это промежуточное звено между издателем и подписчиком. С их помощью строятся цепочки обработки, трансформации и фильтрации данных.

4) Subjects — субъекты

Особый вид Publisher. Объекты, реализующие этот протокол, могут отправлять значения подписчикам через метод .send(_).

Subjects полезны для интеграции императивного кода: позволяют вручную вставлять значения в поток.

Управление подпиской

Publisher продолжает отправку до завершения или ошибки. Если подписка больше не нужна, её можно отменить с помощью метода cancel(). Все подписчики реализуют протокол Cancellable.

Пример использования Combine с URLSession

var cancellable = Set<AnyCancellable>()

func sendURLRequest(_ urlRequest: URLRequest) {
	URLSession.shared.dataTaskPublisher(for: urlRequest) // 1
    	.map(\.data) // 2
    	.decode(type: LocationModel.self, decoder: JSONDecoder()) // 3
    	.mapError { $0.toServerError() ?? .unidentifiedError } // 4
    	.receive(on: DispatchQueue.main) // 5
    	.sink { completion in // 6
        	print("finished stream with: \(completion)")
    	} receiveValue: { value in
        	print("receive value: \(value)")
    	}
    	.store(in: &cancellable) // 7
}

Что происходит:

  1. Создание Publisher — оборачивает загрузку данных по URL.

  2. map(.data) — извлекает Data из ответа.

  3. decode — преобразует Data в модель LocationModel.

  4. mapError — конвертирует ошибку в нужный формат.

  5. receive(on:) — переключает поток на нужную очередь.

  6. sink — обрабатывает завершение и полученные данные.

  7. store(in:) — сохраняет подписку, чтобы поток не завершился сразу.

Такой подход делает код более читаемым, управляемым и реактивным.

Больше про iOS-разработку — в нашем Telegram-канале Surf Mobile Team. Кейсы, лучшие практики, новости индустрии, анонсы наших мероприятий и вакансий.

Присоединяйтесь!

Теги:
Рейтинг0
Комментарии1

ОТП Банк – трижды победитель премии по клиентскому опыту CX World Awards 2024/2025

На 10 ежегодной церемонии вручения премии по клиентскому опыту CX WORLD AWARDS ОТП Банк был признан победителем сразу в 3 номинациях:

- Лучший проект изменений, CX Трансформация (CX - Customer Experience)

В рамках данного проекта СХ команда ОТП Банка внедрила единый подход к исследованиям и разработке продуктов «от клиента», а также интегрировала клиентоцентричный подход в работу всего банка. В результате данных преобразований индекс лояльности клиентов (NPS) за год вырос более чем в 1,5 раза.

- Лучшая практика измерения и улучшения клиентского опыта
Эксперты высоко оценили практики ОТП Банка по инновационной системе сбора обратной связи в виде удобных микро-опросов в мобильном приложении банка, которые позволяют получать мгновенный отклик клиента и сразу брать проблему в работу. Микро-опрос предполагает широкий выбор предустановленных вариантов ответов, что сделало возможным минимизировать число открытых вопросов, на которые клиенты, как правило, не хотят тратить время. Благодаря такому подходу отклик на опросы вырос до 20% от всей базы клиентов.

- Лучший опыт сотрудников (Employee Experience - EX)
Культура работы с сотрудником ОТП Банка как с главным клиентом, которая делает его по-настоящему счастливым, вовлеченным, заинтересованным в работе и продуктах банка, была признана жюри одной из лучших. Проект включал в том числе улучшение продуктов и клиентских путей для сотрудников, а также перевод более десятка HR процессов в диджитал. В результате eNPS за год вырос до 40 п.п.

СХ WORLD AWARDS - самая крупная, престижная и признанная всеми участниками рынка профессиональная премия в индустрии клиентского опыта. Ежегодно в премии принимает участие более 350 номинантов и более 500 гостей из индустрии СХ на Торжественной Церемонии становятся свидетелями награждения Лауреатов Премии. Цель Премии – содействовать развитию клиентоцентричной стратегии компаний, выявляя и поддерживая профессионалов и лидеров рынка.

Оценка проектов номинантов проходила в 2 этапа. На 1 этапе все участники подавали письменное эссе с максимально подробным описанием проекта, достижений, стратегии. После оценки экспертного жюри финалисты приглашались на онлайн- защиту, по ее итогам жюри определяет лауреатов и победителей. Все финалисты приглашаются на торжественную церемонию объявления имён Победителей и Лауреатов премии.

Теги:
Рейтинг0
Комментарии2

Ближайшие события

⚡️Вести с полей - Duit

Новый релиз flutter_duit v3.5.0!

Что внутри:

⚙️ Новые виджеты: AnimatedAlign, AnimatedRotation, AnimatedPadding, AnimatedPositioned, AnimatedScale

⚙️ Фикс работы колбека окончания анимации для implicitly animated widgets

⚙️ Добавлены отсуствующие свойства атрибутов для виджета ElevatedButton

⚙️ Добавлена обработка свойств TextDecoration при парсинге TextStyle

⚙️ Передача свойства body для виджета Scaffold теперь осуществляется через свойство child json-схемы, а не через атрибуты виджета

⚙️ Исправление ряда багов в DSL-пакетах

Подробности о самом интересном:

🔧 В рамках релиза удалось исправить ряд проблем с DSL, где отсутствовали реализации некоторых виджетов (например AnimatedSize в duit_go)

🛠 Улучшена стабильность фреймворка, увеличено покрытие важных участков кода тестами

Поддержать проект:
- Кодом
- Денежкой
- TG канал DUIT

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Android-приложение «Контакты»: работает — не трогай

У многих полей контакта есть типы. Например, у номеров телефонов или адресов электронной почты по умолчанию есть типы «рабочий» и «домашний». Аналитики сказали, что нужно реализовать дополнительные типы и дать пользователю возможность создавать свои. Звучит легко, но на деле оказалось совсем непросто.

Чтобы заменить стандартные типы полей, нужно добавить новую базу данных с доступными типами полей, а также реализовать отображение и возможность выбора поля. Для этого пришлось во многом переписать код редактирования полей контакта, где и без этого логика была непростой. Теперь стало совсем сложно: при добавлении или обновлении поля в contentProvider нужно указывать тип поля, так что мы начали указывать «custom».

После добавления кастомных типов приложение потеряло стабильность, появились кейсы, в которых кастомные типы работали неправильно. Один из них приводил к крашу: база данных не успевала создаваться при открытии интента на редактирование контакта.

Изначальный путь пользователя — это открыть приложение и увидеть список контактов с аватаркой, именем и номером телефона. Пока этот список подгружался на экране, база данных обычно успевала создаться. Но мы не учли, что при открытии интента на редактирование контакта из другого приложения сразу появляется экран редактирования — в этом случае база данных не успевала инициализироваться.

Создание схемы БД и инициализация стандартными значениями происходила в отдельном потоке, так что у нас получилась небольшая гонка потоков. UI готов отобразить экран и идет в БД за данными, но БД не успевает инициализироваться, так что запрос приводил к критической ошибке. Баг воспроизводился при попытке обратиться к БД только при первом холодном запуске на устройстве или после очистки данных, так как здесь приложению приходится заново создавать схему базы данных.

Пришлось опять добавлять костыль: в отдельной корутине ожидать инициализации БД и только потом начинать рисовать экран...

Дмитрий Бражник, старший инженер-программист в департаменте разработки мобильных приложений YADRO, рассказал в статье, как его команда пыталась допилить стандартное AOSP-приложение «Контакты» и к чему они в итоге пришли.

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии0

Решаю строительные задачи с помощью питона на телефоне

Привет хабр!
Я учусь в строительном сфере Проектировщиком здании.
Во время уроков я пользуюсь pydroid3 и задачи похожую на математику решаю питоном.
Из библиотек я пользуюсь основном Jupyter notebook и sympy::{solve,simplify} и math::{degrees,radians,sin,cos,hypos}. А pandas, mathplot, ipycanvas для красивого оформления.
На моём телефоне собралось много решённых и не решённых задач и я решил попробовать публиковать на гидхаб.
Хочу представить вам мою публикацию гидхаб Kurut‑eater/TaskWithHelpPL
Каталог «Osnovy_i_fundamenty» является моей первой публикацией
На данный момент я сделал задачу «Выбор оборудования для погружения несущих элементов». Дальнейшая будущие идей будут зависеть от общества.

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии7

Зачем разработчику учиться работать с неопределенностью, развивать мультиперспективность и прокачивать социальную стелс-механику?
Об этом (и о том, что вообще эти слова значат) рассказал наш Senior Software Developer Леша Приньков, который параллельно ведёт академическую карьеру в математике. В общем, с абстракциями, сложными системами и парадоксами неопределённости он на «ты». Бери на заметку неклишированные и реально актуальные софт-скилы 2025 года. 

Скил №1: Эмоциональный интеллект 
в виртуальной реальности
Включает в себя:
1. Умение считывать невербальные сигналы — тон, мимику, паузы (даже
в Zoom). Так ты лучше поймешь эмоциональное состояние собеседника.

2. Способность подстраиваться под эмоциональный контекст. Это делает общение более плавным и понятным.

Скил №2: Этикет
в онлайн-взаимодействии
Включает в себя:
1. Уважение к собеседникам.
Без пассивной агрессии 
и колкостей — просто вежливо и по делу.

2. Ясные и короткие сообщения. Чтобы никто не запутался и всё понял с первого раза.

3. Уважение к чужим границам. Не пересылаешь личную инфу без разрешения и не навязываешься.

Скил №3. Креативное решение задач с помощью нейросетей
Это про умение формулировать запросы к ИИ, чтобы получать крутой результат.
Скил пригодится как для быстрого решения рутинных задач, так и тогда, когда нужно придумать нестандартное решение. В общем, учимся составлять максимально четкие запросы с примерами и деталями.

Скил №4. Работа с неопределенностью и использование вероятностного подхода в принятии решений
Включает в себя:
1. Умение учитывать разные сценарии и просчитывать риски. Так ты принимаешь более взвешенные решения.

2. Использование данных
и аналитики для оценки вероятностей. Это повышает точность твоих прогнозов.
Также работа с неопределенностью требует гибкости и способности адаптироваться к меняющимся условиям. А это, кстати, еще один важный скил. 

Скил №5. Адаптивность
и гибкость
Включает в себя:
1. Умение быстро перестраиваться под новые задачи, условия и инструменты.
2. Способность учиться на ходу и не застревать в старых подходах.

А еще этот скил помогает сохранять продуктивность и мотивацию в условиях неопределенности.

Скил №6. Мультиперспективность
Это про умение посмотреть на задачу глазами не только разработчика.
За счет этого скила можно: 
— принимать более эффективные решения, ведь ты видишь больше вариантов решения.
— видеть риски, которые незаметны при узком взгляде, и снижать их.
— генерить нестандартные идеи, комбинируя подходы из разных областей.

Скил №7. Управление уровнем детализации
Это про способность поддерживать нужный уровень абстракции. Где надо — зарываешься в детали, где не надо — держишь фокус на главном.

Этот скил помогает лучше понимать общую картину
и объяснять суть задачи, не запутывая ни себя, ни других. В итоге ты работаешь продуктивнее и тратишь меньше времени и сил. 

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Всем привет! Меня зовут Ульяна, я ведущий разработчик мобильных приложений и писатель. Занимаюсь всем от регистрации девайсов до код-ревью и CI. В отпуске я планировала поменьше сидеть за компом, но как бы не так! Расскажу по порядку.

Я обожаю фантастику, космос и, конечно же, звёзды. В Сибири можно отъехать от города на десяток километров и увидеть звёзды, огромные и яркие. В этом году я поехала в Таиланд и хотела сравнить видимые звёзды. Но тёмных дорог там просто нет! Сотрудники отеля подсказали площадку. Договорилась с местным водителем прокатиться ближе к вечеру.

Чего я никак не ожидала — что поеду в кузове по размытой бетонке. С правой стороны нависала гора и местами осыпалась на дорогу, слева был обрыв. Было похоже на американские горки, только к сидениям ты совершенно не пристёгнут. Из-за переполняющих меня эмоций стала делать видео, сначала в настроении «если я не вернусь — завещаю…», а потом: «как же страшно и красиво!»

На площадку приехали до заката, и вскоре айфон сообщил, что память заполнена. Я отправила видео подругам, удалила на телефоне и стала снимать новые. Успела проделать так несколько итераций, наверное, раза три. Потом наступили серые сумерки и появилась первая звёздочка. А через пять минут на площадке включились фонари и прожекторы — и все звёзды исчезли.

А мой телефон сел, и после зарядки застрял на иконке яблока. Оказалось, айфон позволяет занять даже и ту память, которая необходима для старта операционки! А я научилась чинить и это.

Теги:
Всего голосов 3: ↑3 и ↓0+7
Комментарии0
12 ...
7