2. PARALLELS CONFIDENTIAL – DO NOT DISTRIBUTE
Руслан Садовников
Ведущий программист-разработчик
Parallels Access
Добавляем кроссплатформенности iOS приложению
3. 3
APPLIFY YOUR UNIVERSE!
PARALLELS ACCESS
Позволяет использовать компьютерные приложения на
iPad так, как будто они были для него разработаны
4. 4
История возникновения Parallels Access
2008 – Первая версия Parallels Mobile
• «Реактивный» продукт — реакция на
происходящее на рынке
• Дополнение к Parallels Desktop 4 for Mac
• Базовая функциональность для работы с
виртуальными машинами
• Поддержка iPhone
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
5. 5
История возникновения Parallels Access
2010 – Большой апгрейд Parallels Mobile
• Эволюция текущего продукта
• Компонент Parallels Desktop 6 for Mac
• Удаленное управление виртуальными
машинами
• Поддержка iPhone и iPad
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
6. 6
История возникновения Parallels Access
2011 – Обновление Parallels Mobile
• Эволюция текущего продукта
• Компонент Parallels Desktop 7 for Mac
• Удаленное управление виртуальными
машинами
• Поддержка iPhone и iPad
• Удаленное управление удаленным
хостом (Mac-only)
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
7. 7
История возникновения Parallels Access
2012 – Начата разработка новой версии Parallels Mobile
с учетом:
• Новых идей
• Текущих проблем рынка
• Пожеланий пользователей
• Потребностей рынка
• Позиций конкурентов
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
8. 8
2013 - Релиз Parallels Access 1.0
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
9. 9
Пресса
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
"In short, Access does a lot more than just blast your computer’s screen onto the iPad’s. It truly does
“appify” your computer’s programs. It creates a smooth, logical hybrid of iPad and “real” computer, in
away that the VNC apps do not. It works amazingly well." – David Pogue, New York Times (US)
“It isn't the only iPad app that can remotely control computers, but of the ones I've tested, it does the
best job of treating the computer programs it accesses as if they were iPad apps, without sacrificing
functionality.” – Walt Mossberg, The Wall Street Journal (US)
400+ статей о Parallels Access
300+М потенциальных просмотров
89% позитивная реакция (10% нейтральная)
10. 10
Промо в App Store
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
12. 12
Что же мы имеем
• Клиент только под iOS
• Клиент – разработчик аутсорсинговая
кампания
• Server + SDK(C++) – разработчик
Parallels
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
15. 15
iOS - причешем? Android - напишем рядом?
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
16. 16
Волевое решение
• Выделяем бизнес-логику – RemoteClientCore
• RemoteClientCore пишем на С++
• Добавляем SDK по вкусу
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
17. 17
Protocol Buffers — язык описания данных. Google
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
Описываешь структуру данных в .proto-файле
http://ru.wikipedia.org/wiki/Protocol_Buffers
message Car {
required string model = 1;
enum BodyType {
sedan = 0;
hatchback = 1;
SUV = 2;
}
required BodyType type = 2 [default = sedan];
optional string color = 3;
required int32 year = 4;
message Owner {
required string name = 1;
required string lastName = 2;
required int64 driverLicense = 3;
}
repeated Owner previousOwner = 5;
}
18. 18
Protocol Buffers — язык описания данных. Google
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
Компилируешь под свою платформу
http://ru.wikipedia.org/wiki/Protocol_Buffers
Большое кличество компиляторов: C++, Java, Python, С#, Action Script, Clojure, Common
Lisp, D, Erlang, Go, Haskell, JavaScript, Lua, Matlab, Mercury, Objective-C, OCaml, Perl,
PHP, Python, Ruby, Scala, Visual Basic, Delphi и т.д.
Результатом будет класс, который содержит простейшие методы доступа ко всем полям
типа get/set, а также методы для сериализации и десериализации вашей структуры
данных в/из массива байтов.
19. 19
Protocol Buffers — язык описания данных. Google
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
http://ru.wikipedia.org/wiki/Protocol_Buffers
• Простота использования
• Хорошая документация
• Поддержка большого количества языков
• Обратная совместимость
20. 20
ZeroMQ — библиотека обмена сообщениями. iMatix
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
http://zguide.zeromq.org/
ZeroMQ обеспечивает взаимодействие между потоками выполнения. Это
взаимодействие максимально унифицировано для нитей, процессов, локальных и
глобальных сетей.
Ключевой метод — передача информации с помощью сообщений, вместо обеспечения
прямого доступа в ней. Для этого внутри библиотеки ZeroMQ используются
неблокирующие алгоритмы и структуры данных en.wikipedia.org/wiki/Non-
blocking_algorithm, а прикладной программист всего лишь использует ее элегантный
API.
21. 21
ZeroMQ — библиотека обмена сообщениями. iMatix
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
http://zguide.zeromq.org/
• Проста в использовании
• Хорошо написана
• Отлично документирована
• Великолепная производительность
• Поддержка большого количества языков
• Отзывчивое комьюнити
22. 22
Результат
• Бизнес-логика отделена от платформенного кода
• Простота тестирования этой логики
• Скорость и простота реализации
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
23. 23
Подводные камни
• Все API должно быть описано в Protocol Buffers
• Все API асинхронно
• Количество генеримого кода(методов) из *.proto
• Сериализация/десериализация Protocol Buffers
PARALLELS CONFIDENTIAL -- DO NOT DISTRIBUTE
Добавлять кроссплатформенности мы будет Parallels Access. Для начала, я раскажу, что такое Parallels Access. И поскольку, исторический момент, в том числе, сыграл не маловажную роль в принятии тех или иных решений. Я добавлю немного истории - как развивался наш продукт. Затем я расскажу каким образом имея iOSприложение, мы сделали его кроссплатформенным.
Это приложение для удаленного доступа к компьютеру под iPad. Когда я говорю iPad, я подразумеваю и iPhone и другие устройства на базе Android и т.д. Таких приложений много, но особенность нашего приложения в том, что оно позволяет работать с ними, как будто они написаны под iPad. Речь идет о поддержке жестов, о работе с текстом используя разные технологии выделения, копирования и т.д. Те технологии которые оставляют пользователя в рамках его экспириенса работы с девайсом.
Начиналось все достаточно давно, когда у нас уже было несколько успешных версий PD, и мы решили, что надо как-то присутствовать на мобильном рынке в том числе. И поскольку основная таргет аудитория нашего флагманского продукта это Mac-аудитория, то было решено выпустить приложение под iPhone.Это было дополнение к Parallels Desktop-у. В котором была реализована базовая функциональность, что-то из серии «запустить – остановить ВМ», и, в общем-то все.
Через два года продукт эволюционировал в версию, с которой уже можно было не только запускать-останавливать виртуальные машины, но и управлять ими внутри. К тому времени вышел iPad, и была добавлена поддержка для него.
Постепенно пришло понимание, что ограничиваться только виртуальными машинами для управления как-то глупо, и мы добавили возможность работы с самим компьютером (только мак), по сути, перейдя в категорию обычных продуктов удаленного доступа… И тут мы начали понимать, что, кажется, что-то пошло не так…
Так что в 2012 году стартовал проект новой версии Parallels Mobile, которая должна была бы решить те проблемы, с которыми мы столкнулись в процессе эволюции PM
Так мы в итоге получили Parallels Access — после многочисленных идей и переделок, и даже смены названия.
Timeline for app store approval
Timeline for app store approval
Идей была куча... С ними все ясно. Кстати к тому моменту было четко понятно, что отрицать андроид просто бессмысленно и рано или поздно надо будет выходить и на эту платформу.А вот с проблемами надо рабираться и как то их решать.Посмотрим что же у нас есть под «капотом»
И так возвращаемся в 2012 год.Parallels Mobile– клиент-серверное приложение. Серверная часть + SDK обеспечивающее работу с серверной частью -написана нами – в недрах Parallels, при этом написано на C++.Клиентская же часть Parallels Mobile, релизов 2010 и 2011 годов, приоткрывая завесу - написана аутсорсинговой компанией. Что же мы имеем...В итоге весь девелопмент перезжает в Parallels – мы решаем писать клиенты под разные платформы своими силами.Дальше мое повествование пойдет о клиентской части приложения
Как любому девелоперу, не застройщику... посмотрев чужой код, хочется его улучшить и не просто его улучшить В нашем случае код надо было сделать кросплатформенным...
Так что же делать?Вариант использовать готовое решение для нас, был фактически риторическим. 1 – у нас был код и выбрасыть оный никто не собирался - любая большая, да и не только, кампания стремиться к «реюзу» кода, и не только потому, что жаль времени и средств потраченных на него.2 - прибегая к готовым всеобъемлющим сторонним решениям, их практически невозможно быстро либо гибко, главное слово тут гибко, настроить под себя. В итоге борьба перетекает в русло борьбы с этим решением, нежели с написанием кода и получением результата. ДА - Большинство существующих решений сулят неимоверную скорость разработки и афигительный результат в виде Hello World! НО - выйти за рамки Hello World! требует серьезных усилий.Кинуться всем резко писать, например, на C# используя все прелести .NET фрейворка - не очень привлекало. Вариант отпал.
Поскольку проблем с вызовом С/С++ кода из objective-c проблем нет. Аутсорсинговые девелоперы не долго думая сделали монолитный клиент в котором по месту вызывали С код. Тут же была обработка колбэков, ивентов и прочего.Имея довольно плотно срощеный iOS-клиент с SDK тем не менее - работающий...может причесать его? Все равно андроид будет позже.А androindнапишем рядом? Возмем Java Native Interface, возмем наш SDK и будем нам хорошо. Да – это воистину джидайский путь писать большое количество функционально дублирующего кода. И если учесть, что количество этого функционала будет только расти – очевидно тупиковое направление....
Рефакторинг был неизбежен в любом случае и мы это понимали.....Но такое решение позволяет нам написать бизнес-логику один раз для наших платформ, при этом запользовать все остальные наработки.Оставляя всего один вопрос как это связать с платформенным кодом?
Protocol Buffers — язык описания данных, предложенный Google[1], как альтернатива XML. Предполагается, что Protocol Buffers проще и легче, чем XML.Для того, чтобы определить структуру сериализуемых данных, необходимо создать .proto-файл с исходным кодом этой структуры. приведен пример .proto-файла для описания информации о машине: марка, тип кузова, цвет, год выпуска и информация о предыдущих владельцах.
Protocol Buffers — язык описания данных, предложенный Google[1], как альтернатива XML. Предполагается, что Protocol Buffers проще и легче, чем XML.Для того, чтобы определить структуру сериализуемых данных, необходимо создать .proto-файл с исходным кодом этой структуры. приведен пример .proto-файла для описания информации о машине: марка, тип кузова, цвет, год выпуска и информация о предыдущих владельцах.Примечательно, что можно добавлять к уже созданной структуре данных новые поля без потери совместимости с предыдущей версией: при парсинге старых записей новые поля просто будут игнорироваться.
Protocol Buffers — язык описания данных, предложенный Google[1], как альтернатива XML. Предполагается, что Protocol Buffers проще и легче, чем XML.Для того, чтобы определить структуру сериализуемых данных, необходимо создать .proto-файл с исходным кодом этой структуры. приведен пример .proto-файла для описания информации о машине: марка, тип кузова, цвет, год выпуска и информация о предыдущих владельцах.
Если Вы написали о отладили приложение на своем ноутбуке, то с минимальным реконфигурированием сможете использовать мощный бокс с десятками ядер или кластер из таких боксов.