Pull to refresh
107
0
Рубанов Михаил @akaDuality

Head of Mobile at Dodo Engineering

Send message

Особенности подготовки текстов для правильного воспроизведения в программах для незрячих

Reading time11 min
Views803

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

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

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

Но, как быстро выяснилось, информация в чистом виде очень плохо воспринимается на слух. Её нужно специально подготавливать, чтобы было кратко и информативно. И даже незначительные изменения в форматировании текста приводят к тому, что он полностью меняется при озвучании скрин-ридерами.

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

Набором этих правил я и хочу поделиться.

Читать далее
Total votes 15: ↑15 and ↓0+15
Comments9

От Style Transfer до диффузии: эволюция визуальных эффектов на смартфонах

Level of difficultyMedium
Reading time11 min
Views2.2K


Четыре года я занимаюсь разработкой различных спецэффектов для фото и видео в мобильных приложениях. Вроде бы это локальная и как бы несерьезная тема, но одну только плачущую маску в Snapchat посмотрели 9 млрд раз. Такие штуки пользуются бешеной популярностью и здорово повышают виральность мобильных приложений, но с каждым годом удивлять людей становится все сложнее.


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

Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments1

За гранью App Store, или Что нового открывает MDM и Supervised для B2B в iOS

Reading time14 min
Views7.6K
Привет! Меня зовут Денис Кудинов, я iOS-Development team lead в «Лаборатории Касперского». В этой статье расскажу об Mobile Device Management, а также о supervised- и BYOD-режимах — как работает технология и что с ее помощью можно сделать такого, что недоступно обычным приложениям из App Store. Считайте это презентацией возможностей Configuration Profiles, да и Apple MDM в целом :)

image

Статья будет полезна разработчикам B2B-приложений для iOS, которые хотят разбавить свои инструменты новыми фичами, а также для product owner-ов и бэкенд-разработчиков, которые хотят поддержать взаимодействие с мобильными устройствами.
Читать дальше →
Total votes 11: ↑11 and ↓0+11
Comments3

Как встроить С-библиотеку в Swift-фреймворк

Reading time4 min
Views6.5K


В 2014 году был представлен Swift, новый язык для разработки приложений экосистемы Apple. Новинка принесла не только новые возможности и функции, но и проблемы — тем, кто хотел пользоваться старыми добрыми C-библиотеками. В этой статье я рассмотрю одну из них — бандлинг C-библиотеки в Swift-фреймворк. Существует несколько способов её решения; в данном случае я объясню, как сделать это при помощи clang explicit-модулей.

Для примера мы возьмём внешнюю C-библиотеку libgif и встроим её в наш Swift-фреймворк GifSwift. Если вы хотите сразу увидеть результат, полностью проект можно посмотреть здесь.
Читать дальше →
Total votes 34: ↑34 and ↓0+34
Comments0

Делай нейминг как сеньор

Reading time13 min
Views115K

Это объект Pizza, там хранится инфа о латте, а заказали его в Restaurant или в Pizzeria? Неудобно? Максимально. Мы читаем код существенно больше, чем пишем. И хочется сразу понимать, что происходит, не играя в квесты «что имел в виду автор», «да как это работает» и «я снова ничего не понял». Без навыка давать хороший нейминг невозможно писать качественный и поддерживаемый код. Про нейминг говорят заодно, в рамках архитектуры и общих инженерных практик. В статье поговорим про него отдельно.

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

Читать далее
Total votes 186: ↑184 and ↓2+182
Comments221

Почему я отказался от стандартной клавиатуры и никогда к ней не вернусь. Часть 1 (История клавиатуры)

Reading time17 min
Views68K

Сколько не совершенствуй свои клавиатурные навыки, не достигнешь значительного прогресса, используя стандартную клавиатуру. Она давно устарела, но большинство готово с этим мириться. Чтобы понять почему она устарела, необходимо разобраться в её истории.

Читать далее
Total votes 172: ↑144 and ↓28+116
Comments644

Адаптируем Android приложение для незрячих людей. Часть 1: основы

Reading time19 min
Views6.3K

В один из зимних вечеров я сидел дома, читал замечательную книжку «Android-программирование для профессионалов» и наткнулся на главу про Accessibility. Раньше я об этой теме не задумывался: клал null в поле contentDescription и жил себе спокойно. Но когда узнал, как слабовидящие люди пользуются смартфоном, у меня появилось желание погрузиться в тему доступности глубже.

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

Читать далее
Total votes 7: ↑7 and ↓0+7
Comments6

Адаптируем Android-приложение для незрячих людей. Часть 2: Jetpack Compose

Reading time8 min
Views2K

По данным ВОЗ, в мире более миллиарда человек обладает с той или иной формой инвалидности. Поэтому Accessibility, или доступность, — важная штука в разработке программного обеспечения, особенно под мобильные платформы.

Адаптировать View-интерфейс для людей с ограниченными возможностями не так трудоёмко, как кажется: об этом мы рассказывали в предыдущей статье.

Сегодня — про Accessibility в Jetpack Compose: в нём сделать доступный графический интерфейс приложения ещё легче, чем на View. Разбираемся, как устроена поддержка доступности в Compose и какие особенности учесть при разработке.

Читать далее
Total votes 6: ↑6 and ↓0+6
Comments0

Демейк интерфейсов — Figma CS2

Reading time3 min
Views6.7K

Как выгладил бы интерфейс Figma существуй она в 2006 году.

Всем привет! Я продуктовый дизайнер в одной небольшой компании и работаю там довольно давно. В последнее время я стал скучать по тем временам, когда я дизайнил что-то в свое удовольствие, просто веселья ради. И вот сидя однажды вечером, я подумал, а почему бы и нет? Сейчас запилю чего-нибудь этакое, честному народу на потеху, эге-гей! Ну и понеслось.

Читать далее
Total votes 23: ↑23 and ↓0+23
Comments8

Держите OKR подальше от моих GEMs

Reading time8 min
Views2.1K

Работая над подходом к формированию целей и организации команды, я наткнулся на статью Кэтрин Китинг из Ad Hoc, описывающую формат постановки целей именуемый GEM (Goal -> Experiment -> Measure). Этот подход кажется мне интересным и доступным для внедрения, испытаю его на себе и после коррекций планируем попробовать внутри. Статья впервые публикуется в переводе на русский. Ссылка на оригинал ниже.

Читать далее
Total votes 5: ↑5 and ↓0+5
Comments0

Яндекс выпускает DivKit — фреймворк для server-driven UI с открытым кодом

Reading time12 min
Views50K
Привет! Сегодня Яндекс выкладывает в опенсорс DivKit — фреймворк для отрисовки интерфейсов из ответа сервера. Серверная вёрстка поможет ускорить разработку: наладить отправку апдейтов от сервера разным версиям приложения, создать прототип или просто написать интерфейс один раз для нескольких платформ.


Фреймворк включает в себя несколько библиотек: клиентскую часть по отрисовке интерфейсов для Android, iOS и веба, а также DSL для формирования ответа сервера на Kotlin, TypeScript и Python. Исходный код опубликован на Гитхабе под лицензией Apache 2.0.

Сейчас DivKit используется в приложении Яндекс, Алисе, Едадиле, Маркете, ТВ и других приложениях. В этом посте я постараюсь вспомнить историю фреймворка, затем мы напишем с его помощью небольшой просмотрщик ленты Хабра, а в конце я покажу ещё несколько простых примеров интеграции.
Читать дальше →
Total votes 124: ↑117 and ↓7+110
Comments49

Все, что нужно знать об iOS App Extensions

Reading time7 min
Views20K


App Extensions появились в iOS 8 и сделали систему более гибкой, мощной и доступной для пользователей. Приложения могут отображаться в виде виджета в Центре Уведомлений, предлагать свои фильтры для фотографий в Photos, отображать новую системную клавиатуру и многое другое. При этом сохранилась безопасность пользовательских данных и системы. Об особенностях работы App Extensions и пойдёт речь ниже.
Читать дальше →
Total votes 24: ↑24 and ↓0+24
Comments4

Делись и больше не дерись: ограничения и сложности в разработке Share Extension

Reading time16 min
Views4.1K

Привет! На связи iOS-разработчик KODE — Семён Медведев. Наша команда разрабатывает крутые цифровые продукты для государства и бизнеса, в том числе мобильные приложения.

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

В процессе я столкнулся со множеством нюансов, выяснение которых заняло у меня некоторое время. Я решил обобщить свой опыт в одном материале и рассказать об ограничениях и сложностях, с которыми могут столкнуться начинающие iOS-еры при разработке Share Extension.

Читать далее
Total votes 3: ↑2 and ↓1+1
Comments0

[boringssl] Failed to log metrics

Reading time7 min
Views5.5K

Наверное, каждый iOS разработчик сталкивался с этой проблемой. Любое приложение, которое делает https запросы, получает в лог эти мистические сообщения от boringssl:

[boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics

Проблема неотключаемого мусорного логирования от boringssl мучала нас много лет, но, кажется, я нашёл приемлемое решение.

Читать далее
Total votes 16: ↑15 and ↓1+14
Comments13

Как мы учимся адаптировать Яндекс Go для незрячих пользователей: ожидания, суровая реальность, чек-лист разработчика

Reading time11 min
Views10K
Может показаться, что работа над доступностью приложения для незрячих пользователей заключается лишь в том, чтобы подписать все элементы интерфейса для скринридера. Мы тоже так раньше думали. Реальность оказалась куда сложнее.

Девушка пользуется приложением Go

Привет! Меня зовут Николай Морев, я разрабатываю iOS-версию приложения Яндекс Go. Не буду скрывать: долгое время незрячим и слабовидящим пользователям было крайне сложно, а порой и невозможно пользоваться нашим приложением.

Первые попытки, которые мы предприняли, должны были решить проблему малой кровью. Этот подход оказался наивным, но он принёс нам опыт, которым я хочу поделиться с другими разработчиками в этом посте. Под катом расскажу, почему работа над доступностью — это прежде всего работа над UX, а уже во вторую очередь — над API. Покажу примеры, когда эвристики системного скринридера приносили больше вреда, чем пользы. Объясню, почему для работы над доступностью нам потребовалась помощь ещё и бэкендеров.

Приложению Яндекс Go ещё далеко до идеала, нерешённых проблем хватает. Но, надеюсь, накопленный нами опыт поможет другим.
Читать дальше →
Total votes 42: ↑42 and ↓0+42
Comments17

Кодогенерация DTO: зачем она нужна и как её настроить

Reading time12 min
Views20K
Data Transfer Object — модель данных, которые мы передаём из одного слоя приложения в другой. В Яндекс Go мы активно используем DTO. Предположим, нужно отобразить в UI приложения для вызова такси экспериментальную кнопку с двумя свойствами — надписью на кнопке и ориентировочным временем ожидания такси. Тогда в сетевом слое надо написать примерно такую DTO-модель:

struct OrderButtonExperimentDTO: Decodable {
   let buttonTitle: String
   let estimationMinute: Int
}

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

Поэтому мы решили добавить механизм, который сам бы составлял и переписывал код моделей DTO в зависимости от исходного формата.
Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments6

Создаем Swift Package на основе C++ библиотеки

Reading time5 min
Views5.9K

Данная статья поможет вам создать свой первый Swift Package. Мы воспользуемся популярной C++ библиотекой для линейной алгебры Eigen, чтобы продемонстрировать, как можно обращаться к ней из Swift. Для простоты, мы портируем только часть возможностей Eigen.

Читать далее
Total votes 11: ↑10 and ↓1+9
Comments2

Макросы в Vim — это просто

Reading time4 min
Views28K

Макросы в Vim


Очень странно, с одной стророны тема довольно банальная, а с другой ни тут, ни на просторах интернета не видно хорошего понимания такой важной темы, которая может иногда сильно упростить задачу редактирования текста. К написанию меня подтолкнуло обсуждение макросов в Emacs в блоге Avdi Grimm'а, где в своё время никто не смог внятно объяснить, что в Vim есть то, чего ожидает автор поста от достойного текстового редактора. Исправим это, в первую очередь в себе, а потом пойдём и скажем этим из интернета, что они не правы.

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

В этом топике мы научимся использовать макросы с этой самой задачей.

Давайте сначала вспомним, как это сделать вручную.
f,r0
После чего можно нажимать последовательно ; для повторного поиска и . для повторения предыдущего действия. Но в какой-то момент это может стать не так просто, например, вам нужно добавить пару каких-то знаков между делом. Точка уже не сработает и нужно будет опять нажимать r0. Или этих запятых окажется довольно много, и щёлкать поочерёдно ; и . придётся довольно много раз. В этот момент что-то вам уже подсказывает, что такой механический труд можно автоматизировать.

Основы
Многократные повторения и рекурсивный вызов
Редактирование макросов
Вечные макросы
Всякое
Познать
Total votes 31: ↑30 and ↓1+29
Comments8

Клавиатура своими руками под свои руки

Reading time24 min
Views343K

Для меня всё началось вот с этого топика о механических клавиатурах, желания научиться печатать быстрее (к своему стыду до недавних пор печатал двумя пальцами, несмотря на 25летний стаж программирования), и появившихся недавно неприятных ощущений в кистях после рабочего дня (да и вообще времени, проведённого за компьютером).
Провёл короткое исследование о том, что вообще есть из клавиатур для программистов и тех, кто много печатает, и написал вот этот обзорный топик. Купил себе Happy Hacking Lite (минималистичная клавиатура с мембранными переключателями), но печатать на ней оказалось ещё менее удобно, чем на ноутбучной, в основном из за ещё более компактного расположения клавиш.
Вскоре появился топик, в котором автор рассказывал о новоприобитённой им Truly Ergonomic, пожалуй, практически идеальной клавиатуры с моей точки зрения, но в комментариях автор же отметил, что спустя два месяца использования так и не смог совсем пересесть на неё, а положение рук совсем не так и удобно, как рекламируется.
Чуть позже появился топик о Kinesis Advantage, по отзыву автора к которой тоже не так легко привыкнуть, а цена так и просто пугает.
И я решил...
Total votes 297: ↑286 and ↓11+275
Comments142

DI в iOS: Complete guide

Reading time24 min
Views38K

Всем привет, меня зовут Виталий, я iOS-разработчик в юните мессенджера в Тинькофф. Сегодня поговорим о том, что такое DI, зачем он нужен, рассмотрим известные библиотеки для DI и сравним их между собой. Поехали!

Читать далее
Total votes 29: ↑29 and ↓0+29
Comments7

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Works in
Date of birth
Registered
Activity