SlideShare a Scribd company logo
1 of 53
Download to read offline
AIDL в современном мире
Виктор Лапин
Руководитель группы разработки
Компания Адвантум
mail: lapin@advantum.pro
twitter: @VictorLapin 1
О чем этот доклад?
● Как мы реализовали взаимодействие между UI
приложения и сервисом воспроизведения аудио при
помощи AIDL
● Какие при этом могут быть подводные камни
● Стоит ли это делать вам
2
Приложение МХТ
3
● Спектакль поделен на
главы
● Главу читает
рассказчик
● Маршрут показан на
карте
Приложение МХТ
● Kotlin
● Android Jetpack
● MVP (Moxy)
● RxJava + RxAndroid
● Koin
4
● Cicerone
● Retrofit + OkHttp
● Yandex MapKit
● Firebase (FCM,
Analytics)
Воспроизведение аудио...
● является фоновой “долгоиграющей” задачей
● должно быть устойчиво к попыткам системы вернуть
выделенные ресурсы
● представляет собой отделимый (и заменяемый) кусок
функционала
5
Аудио плеер должен быть
сервисом
6
PlayerService.kt
class PlayerService : Service(), PlayerServiceView {
private val mScope = getKoin()
.createScope(Const.SERVICE_PLAYER)
private val mPresenter by inject<PlayerServicePresenter>()
/* ... */
}
7
PlayerService.kt
override fun onCreate() {
super.onCreate()
mPresenter.setView(this)
}
8
PlayerService.kt
override fun onDestroy() {
mPresenter.destroy()
mScope.close()
super.onDestroy()
}
9
AndroidManifest.xml
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<service
android:name=".feature.player.PlayerService"
android:label="@string/player_service_title" />
10
Взаимодействие между
сервисом и UI?
11
Способы взаимодействия
1. Intent
1.1. Повторные вызовы startService
1.2. Broadcast (LocalBroadcast)
2. Binder (привязанный сервис)
2.1. LocalBinder (экземпляр сервиса)
2.1.1. PublishSubject
2.2. Messenger
2.3. AIDL
12https://developer.android.com/guide/components/bound-services
Android Interface Definition Language (AIDL)
● Предназначен для облегчения межпроцессного
взаимодействия (Inter-Process Communication)
● Используется для написания контракта, который
сервис и клиенты будут использовать для “общения”
● На основе контракта создается абстрактная “заглушка”
(Stub), которая держит под капотом всю сложную
логику
13https://developer.android.com/guide/components/aidl
Плюсы AIDL
● Проверенная временем технология
● Строгий интерфейс + типизация параметров
● Запас “прочности” на случай усложнения архитектуры
14
Минусы AIDL
● Многопоточность - требуется ручное обеспечение
потокобезопасности
● Относительная сложность реализации
● Для простых приложений/сервисов избыточен
15
С чего начать?
16
Chapter.kt
package ru.advantum.mht.model.entity
data class Chapter(
val name: String,
var isFinished: Boolean
// other fields here
) : Parcelable {
// Parcelable implementation here
}
17
Chapter.kt
package ru.advantum.mht.model.entity
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Chapter(
val name: String,
var isFinished: Boolean
// other fields here
) : Parcelable
18
Chapter.aidl
package ru.advantum.mht.model.entity;
parcelable Chapter;
19
Chapter.aidl
package ru.advantum.mht.model.entity;
parcelable Chapter;
20
IPlayerService.aidl
package ru.advantum.mht.feature.player;
import ru.advantum.mht.model.entity.Chapter;
interface IPlayerService {
void startChapter(long aSpectacleId, String aSpectacleTitle,
in Chapter aChapter);
void pause();
void stop();
void resume();
}
21
IPlayerService.aidl
package ru.advantum.mht.feature.player;
import ru.advantum.mht.model.entity.Chapter;
interface IPlayerService {
void startChapter(long aSpectacleId, String aSpectacleTitle,
in Chapter aChapter);
void pause();
void stop();
void resume();
}
22
IPlayerService.aidl
package ru.advantum.mht.feature.player;
import ru.advantum.mht.model.entity.Chapter;
interface IPlayerService {
void startChapter(long aSpectacleId, String aSpectacleTitle,
in Chapter aChapter);
void pause();
void stop();
void resume();
}
23
PlayerService.kt
inner class PlayerBinder : IPlayerService.Stub() {
// IPlayerService implementation here
}
24
PlayerService.kt
inner class PlayerBinder : IPlayerService.Stub() {
// IPlayerService implementation here
}
25
PlayerService.kt
private val mBinder: IPlayerService.Stub = PlayerBinder()
override fun onBind(intent: Intent): IBinder {
Timber.tag(TAG).d("Service bound")
return mBinder
}
26
RunningSpectaclePresenter.kt
private var mPlayerService: IPlayerService? = null
private val mServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder:
IBinder) {
mPlayerService = IPlayerService.Stub.asInterface(binder)
}
override fun onServiceDisconnected(name: ComponentName) {
mPlayerService = null
}
}
27
RunningSpectaclePresenter.kt
private var mPlayerService: IPlayerService? = null
private val mServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder:
IBinder) {
mPlayerService = IPlayerService.Stub.asInterface(binder)
}
override fun onServiceDisconnected(name: ComponentName) {
mPlayerService = null
}
}
28
RunningSpectaclePresenter.kt
override fun onFirstViewAttach() {
super.onFirstViewAttach()
val intent = Intent(appContext, PlayerService::class.java)
appContext.bindService(intent, mServiceConnection,
Context.BIND_AUTO_CREATE)
}
override fun onDestroy() {
appContext.unbindService(mServiceConnection)
super.onDestroy()
}
29
RunningSpectaclePresenter.kt
fun pauseCurrentChapter() {
mPlayerService?.pause()
viewState.showAudioPlayButton()
}
fun resumeCurrentChapter() {
mPlayerService?.resume()
viewState.showAudioPauseButton()
}
30
Обратная связь от сервиса?
31
IPlayerServiceCallback.aidl
package ru.advantum.mht.feature.player;
import ru.advantum.mht.model.entity.Chapter;
interface IPlayerServiceCallback {
void reportProgress(in Chapter aChapter, int aProgress,
int aDuration, boolean aIsFinished, int aState);
}
32
IPlayerService.aidl
import ru.advantum.mht.feature.player.IPlayerServiceCallback;
interface IPlayerService {
/* ... */
void registerCallback(IPlayerServiceCallback aCallback, String
aCookie);
void unregisterCallback(IPlayerServiceCallback aCallback,
String aCookie);
}
33
PlayerService.kt
private val mCallbacks = object :
RemoteCallbackList<IPlayerServiceCallback>()
34
PlayerService.kt
inner class PlayerBinder : IPlayerService.Stub() {
/* ... */
override fun registerCallback(aCallback:
IPlayerServiceCallback?, aCookie: String) {
Timber.tag(TAG).d("Adding callback from $aCookie")
mCallbacks.register(aCallback, aCookie)
}
}
35
PlayerService.kt
inner class PlayerBinder : IPlayerService.Stub() {
/* ... */
override fun unregisterCallback(aCallback:
IPlayerServiceCallback?, aCookie: String) {
Timber.tag(TAG).d("Removing callback from $aCookie")
mCallbacks.unregister(aCallback)
}
}
36
PlayerService.kt
override fun doProgress(chapter: Chapter, progress: Int,
duration: Int, isFinished: Boolean, state: Int) {
val count = mCallbacks.beginBroadcast()
(0 until count).forEach {
val callback = mCallbacks.getBroadcastItem(it)
callback.reportProgress(chapter, progress, duration,
isFinished, state)
}
mCallbacks.finishBroadcast()
}
37
PlayerService.kt
override fun doProgress(chapter: Chapter, progress: Int,
duration: Int, isFinished: Boolean, state: Int) {
val count = mCallbacks.beginBroadcast()
(0 until count).forEach {
val callback = mCallbacks.getBroadcastItem(it)
callback.reportProgress(chapter, progress, duration,
isFinished, state)
}
mCallbacks.finishBroadcast()
}
38
PlayerService.kt
override fun doProgress(chapter: Chapter, progress: Int,
duration: Int, isFinished: Boolean, state: Int) {
val count = mCallbacks.beginBroadcast()
(0 until count).forEach {
val callback = mCallbacks.getBroadcastItem(it)
callback.reportProgress(chapter, progress, duration,
isFinished, state)
}
mCallbacks.finishBroadcast()
}
39
PlayerService.kt
override fun doProgress(chapter: Chapter, progress: Int,
duration: Int, isFinished: Boolean, state: Int) {
val count = mCallbacks.beginBroadcast()
(0 until count).forEach {
val callback = mCallbacks.getBroadcastItem(it)
callback.reportProgress(chapter, progress, duration,
isFinished, state)
}
mCallbacks.finishBroadcast()
}
40
Я же ничего не забыл? О.о
41
PlayerService.kt
override fun doProgress(chapter: Chapter, progress: Int,
duration: Int, isFinished: Boolean, state: Int) {
// concurrency...
synchronized(this) {
/* val count = mCallbacks.beginBroadcast()
...
*/
}
}
42
RunningSpectaclePresenter.kt
private val mCallback = object : IPlayerServiceCallback.Stub() {
override fun reportProgress(aChapter: Chapter?,aProgress: Int,
aDuration: Int, aIsFinished: Boolean, aState: Int) {
/* some business logic here */
viewState.showProgress(aChapter, aProgress, aDuration)
}
}
43
RunningSpectaclePresenter.kt
private val mCallback = object : IPlayerServiceCallback.Stub() {
override fun reportProgress(aChapter: Chapter?,aProgress: Int,
aDuration: Int, aIsFinished: Boolean, aState: Int) {
/* some business logic here */
viewState.showProgress(aChapter, aProgress, aDuration)
}
}
44
RunningSpectaclePresenter.kt
private val mServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder:
IBinder) {
/* ... */
mPlayerService?.registerCallback(mCallback, TAG)
}
}
45
RunningSpectaclePresenter.kt
override fun onDestroy() {
mPlayerService?.unregisterCallback(mCallback, TAG)
/* ... */
}
46
RunningSpectacleFragment.kt
override fun showProgress(chapter: Chapter,
progress: Int, duration: Int) {
rootView.post {
/* UI changes here */
}
}
47
Теперь весь тяжелый UI
всегда будет в памяти?
48
AndroidManifest.xml
<service
android:name=".feature.player.PlayerService"
android:label="@string/player_service_title"
android:process=":audio"
android:exported="false" />
49
RunningSpectacleFragment.kt
override fun showProgress(chapter: Chapter,
progress: Int, duration: Int) {
activity?.runOnUiThread {
rootView.post {
/* UI changes here */
}
}
}
50
Итоги
● Все работает? - Да!
● Идеальное решение? - Нет
● Можно проще? - Да
● Зачем это все? - Потому что можем :-Р
51
Что осталось за кадром
● Как это отлаживать?
● Что будет с UI приложения?
● Что будет с Dependency Injection?
● Почему все-таки не Messenger?
52
У меня все. Вопросы?
53
Виктор Лапин
Руководитель группы разработки
Компания Адвантум
mail: lapin@advantum.pro
twitter: @VictorLapin

More Related Content

Similar to AIDL в современном мире, Виктор Лапин. 8 июня, 2019

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelperDataArt
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Working with API
Working with APIWorking with API
Working with APIMad Devs
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Roman Tsisyk
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012dmalykhanov
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"Fwdays
 

Similar to AIDL в современном мире, Виктор Лапин. 8 июня, 2019 (20)

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
AndroidMVPHelper
AndroidMVPHelperAndroidMVPHelper
AndroidMVPHelper
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Working with API
Working with APIWorking with API
Working with API
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + ReduxFrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
FrontDays #2. Игорь Лобанов, Миграция Backbone (Marionette) -> React + Redux
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"Алексей Ильенко "In real-time with Apache Kafka"
Алексей Ильенко "In real-time with Apache Kafka"
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

AIDL в современном мире, Виктор Лапин. 8 июня, 2019