перевод 
Переводим без 
интернета 
Ваня Москалёв, 
отдел машинного перевода
Мобильный интернет 
Mobile! 
60 % 
Процент мобильных пользователей 
интернета в мире в 2013 году
Web of Apps 
• Приложения стали практически 
неразделимы от веба, стали 
"представлением" веб-сущности на 
устройстве. 
• ...
Где нужен офлайн? 
• В путешествиях. Например, перевод 
больше всего нужен там, где обычно 
недоступен интернет. 
• При пл...
Я.Перевод 
• 16 марта 2011 – бета-версия онлайн- 
сервиса Яндекс.Перевод. 
• В декабре 2012 – первое мобильное 
приложение...
Архитектура и 
реализация
Как устроен Перевод 
Синхронный 
перевод 
Определение 
языка 
Озвучка 
Машинный 
Предиктор словарь
Используемые веб- 
сервисы 
Translate Detect 
Predictor Text-To- 
Клиентская 
логика 
Speech 
Dictionary 
Прочее
Что нужно было 
сделать 
• Сжать/урезать переводные модели и 
измерить качество. 
• Портировать серверный код на 
устройст...
Что было 
• Система, спроектированная в краткие 
сроки для работы в онлайн-режиме. 
• Довольно высокая связность. 
• Накоп...
Как рефакторили 
• Четко определили и описали 
проблемную область. 
• Понизили связность системы (помогла 
абстракция над ...
Проблемная область 
YTR Domain 
LanguagePair 
Translation 
Prediction 
Dictionary 
Errors 
Business 
Logic 
<I> DAL
Больше абстракций! 
Translate S. Presentation 
Business 
Logic 
Logic 
Predictor S. 
Dictionary S.
Больше абстракций! 
Business 
Logic 
Presentation 
Logic 
Web 
<I> 
Offline 
Web 
Offline 
Web 
Offline 
<I> 
<I>
Проектирование 
логики 
• Нужно было объединить и описать в 
спецификациях все юзкейсы. 
• Был объявлен базовый класс, 
пр...
Юзкейсы 
• Fail-over: переход к офлайн-модели, если 
веб-сервис недоступен. 
• Логика синхронного перевода. 
• "Сборка" от...
Загрузчик 
• Один из самых важных и сложных 
компонентов – загрузчик. 
• Две реализации: для iOS 6 и iOS 7, 
фоновая загру...
Выводы 
• Построенная вокруг концепции 
абстрактных сервисов архитектура 
оказалась самым подходящим решением. 
• Нельзя н...
Грабли
Грабли: NSURLSession 
• Сетевые задачи, созданные в фоне, 
всегда создаются с флагом 
discretionary 
• Такие задачи тормоз...
Грабли: NSURLSession 
NSDictionary *userInfo = @{ @"background" : @(self.context.isBackground) }; 
! 
// Сериализуем в JSO...
Грабли: NSURLSession 
• NSURLSession не умеет возобновлять 
загрузки из Content Delivery Network. 
• Под капотом – If-Modi...
Грабли: mmap 
• Переводные модели состоят из 
нескольких файлов, каждый из которых 
отображается в память. 
• Для перевода...
Грабли: mmap 
File = fopen(path.c_str(), "rb"); 
fseek(File, 0, SEEK_END); 
Size = static_cast<size_t>(ftell(File)); 
fsee...
Грабли: mmap 
• На iPhone 4 / 4S система выделяет около 
700 МБ пространства на девайс. 
• Оптимизация: пришлось пожертова...
Грабли: донести фичу 
до пользователей 
Пользователи сами не 
вникнут в сложный 
функционал. Нужно 
как можно больше 
учит...
Важно: фидбек внутри 
приложения 
Некоторые 
пользователи любят 
жаловаться. 
Встроенная форма 
фидбека поможет 
быстрее р...
С чем мы столкнулись 
• NSURLSession не дружит с CDN. 
• NSURLSession оптимизируется системой. 
• Ограничения виртуальной ...
Открытые вопросы 
(обсудим вместе?) 
• Как грамотно собирать статистику по 
User Experience в гибридном 
приложении? 
• Ка...
Спасибо за внимание!
Ваня Москалёв 
iOS-разработчик, 
отдел машинного перевода 
! 
ivanmoskalev@yandex-team.ru 
@ivanmoskalev
Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван  Москалёв
Upcoming SlideShare
Loading in …5
×

Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван Москалёв

558 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
558
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Переводим без интернета: как мы делали Яндекс.Перевод для iOS, Иван Москалёв

  1. 1. перевод Переводим без интернета Ваня Москалёв, отдел машинного перевода
  2. 2. Мобильный интернет Mobile! 60 % Процент мобильных пользователей интернета в мире в 2013 году
  3. 3. Web of Apps • Приложения стали практически неразделимы от веба, стали "представлением" веб-сущности на устройстве. • Разработчики подчас строят бизнес- логику вокруг получения данных от веб- сервиса.
  4. 4. Где нужен офлайн? • В путешествиях. Например, перевод больше всего нужен там, где обычно недоступен интернет. • При плохом подключении (метро). • Для экономии трафика.
  5. 5. Я.Перевод • 16 марта 2011 – бета-версия онлайн- сервиса Яндекс.Перевод. • В декабре 2012 – первое мобильное приложение – для iPhone, спустя полгода Android, спустя год Windows Phone. • Весна-лето 2014 – версия 2.0 для iOS с офлайн-переводом.
  6. 6. Архитектура и реализация
  7. 7. Как устроен Перевод Синхронный перевод Определение языка Озвучка Машинный Предиктор словарь
  8. 8. Используемые веб- сервисы Translate Detect Predictor Text-To- Клиентская логика Speech Dictionary Прочее
  9. 9. Что нужно было сделать • Сжать/урезать переводные модели и измерить качество. • Портировать серверный код на устройство. • Зарефакторить приложение.
  10. 10. Что было • Система, спроектированная в краткие сроки для работы в онлайн-режиме. • Довольно высокая связность. • Накопившиеся поправки для логики работы приложения.
  11. 11. Как рефакторили • Четко определили и описали проблемную область. • Понизили связность системы (помогла абстракция над сервисами). • Определили, описали и реализовали юзкейсы, обложили их тестами.
  12. 12. Проблемная область YTR Domain LanguagePair Translation Prediction Dictionary Errors Business Logic <I> DAL
  13. 13. Больше абстракций! Translate S. Presentation Business Logic Logic Predictor S. Dictionary S.
  14. 14. Больше абстракций! Business Logic Presentation Logic Web <I> Offline Web Offline Web Offline <I> <I>
  15. 15. Проектирование логики • Нужно было объединить и описать в спецификациях все юзкейсы. • Был объявлен базовый класс, представляющий составной запрос (гибрид Strategy и Command). • Написаны тесты на конкретные реализации этого класса.
  16. 16. Юзкейсы • Fail-over: переход к офлайн-модели, если веб-сервис недоступен. • Логика синхронного перевода. • "Сборка" ответов разных сервисов в составной ответ.
  17. 17. Загрузчик • Один из самых важных и сложных компонентов – загрузчик. • Две реализации: для iOS 6 и iOS 7, фоновая загрузка на iOS 7. • Оказался многофакторным компонентом.
  18. 18. Выводы • Построенная вокруг концепции абстрактных сервисов архитектура оказалась самым подходящим решением. • Нельзя недооценивать сложность сопутствующих задач (загрузчик).
  19. 19. Грабли
  20. 20. Грабли: NSURLSession • Сетевые задачи, созданные в фоне, всегда создаются с флагом discretionary • Такие задачи тормозят и перестают работать если у устройства осталось мало заряда. На это жалуются пользователи ;)
  21. 21. Грабли: NSURLSession NSDictionary *userInfo = @{ @"background" : @(self.context.isBackground) }; ! // Сериализуем в JSON NSData *data = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:nil]; NSString *description = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; ! // Прописываем в taskDescription sessionTask.taskDescription = description; Можно хранить метаданные в -[NSURLSessionTask taskDescription] и при входе в приложение пересоздавать discretionary-задачи
  22. 22. Грабли: NSURLSession • NSURLSession не умеет возобновлять загрузки из Content Delivery Network. • Под капотом – If-Modified-Since и ETag. • Если CDN отдает ETag, то возобновление загрузок сломается (каждый сервер отдает свой ETag).
  23. 23. Грабли: mmap • Переводные модели состоят из нескольких файлов, каждый из которых отображается в память. • Для перевода в одном направлении нужно ~270 МБ виртуального адресного пространства.
  24. 24. Грабли: mmap File = fopen(path.c_str(), "rb"); fseek(File, 0, SEEK_END); Size = static_cast<size_t>(ftell(File)); fseek(File, 0, SEEK_SET); Data = mmap(0, Size, PROT_READ, MAP_SHARED, fileno(File), 0); Объем виртуального адресного пространства на iOS ограничен, mmap может вернуть MAP_FAILED, если она занята другими процессами или недоступна одним чанком.
  25. 25. Грабли: mmap • На iPhone 4 / 4S система выделяет около 700 МБ пространства на девайс. • Оптимизация: пришлось пожертовать скоростью отклика при переключении между направлениями.
  26. 26. Грабли: донести фичу до пользователей Пользователи сами не вникнут в сложный функционал. Нужно как можно больше учить и объяснять.
  27. 27. Важно: фидбек внутри приложения Некоторые пользователи любят жаловаться. Встроенная форма фидбека поможет быстрее разбираться с багами.
  28. 28. С чем мы столкнулись • NSURLSession не дружит с CDN. • NSURLSession оптимизируется системой. • Ограничения виртуальной памяти. • Про фичи нужно не только рассказывать, их нужно показывать. • In-App фидбек – очень удачное решение.
  29. 29. Открытые вопросы (обсудим вместе?) • Как грамотно собирать статистику по User Experience в гибридном приложении? • Как лучше всего осуществлять переход между онлайн и офлайн-режимом? Ручной и автоматический подходы.
  30. 30. Спасибо за внимание!
  31. 31. Ваня Москалёв iOS-разработчик, отдел машинного перевода ! ivanmoskalev@yandex-team.ru @ivanmoskalev

×