2
00:00:09,067 --> 00:00:10,567
Хэннон: Добро пожаловать! Спасибо, что пришли на нашу лекцию
3
00:00:10,567 --> 00:00:12,467
"Google Wave: Под капотом".
4
00:00:12,467 --> 00:00:14,767
Надеемся, вам понравилась утренняя презентация
5
00:00:14,767 --> 00:00:16,567
И мы очень рады рассказать вам
6
00:00:16,567 --> 00:00:18,868
о технологии, которая стоит за всем этим.
7
00:00:18,868 --> 00:00:22,267
Перед вами выступят четыре замечательных разработчика:
8
00:00:22,267 --> 00:00:25,033
Начнёт Дэвид Ванг, продолжит Алекс Ма,
9
00:00:25,033 --> 00:00:29,100
затем Дэн Данилатос и Кейси Витлоу.
10
00:00:29,100 --> 00:00:31,801
Они покажут вам алгоритмы и технологии,
11
00:00:31,801 --> 00:00:34,501
делающих возможной совместную работу в реальном времени.
12
00:00:34,501 --> 00:00:36,300
Они расскажут о расширяемости
13
00:00:36,300 --> 00:00:38,534
нашего редактора, о том, как мы его делали,
14
00:00:38,534 --> 00:00:40,234
и что в нем особенного.
15
00:00:40,234 --> 00:00:42,968
И, наконец, вы видели сервис проверки орфографии этим утром.
16
00:00:42,968 --> 00:00:44,667
Кейси расскажет
17
00:00:44,667 --> 00:00:46,267
о технологии,
18
00:00:46,267 --> 00:00:47,934
с помощью которой он работает.
19
00:00:47,934 --> 00:00:50,133
Мы признательны вам за то, что вы здесь,
20
00:00:50,133 --> 00:00:51,634
а также за проявленный интерес
21
00:00:51,634 --> 00:00:53,133
к Google Wave.
22
00:00:53,133 --> 00:00:54,934
Прежде чем передать им слово, я хочу напомнить вам,
23
00:00:54,934 --> 00:00:57,367
что вы можете оставить отзывы на сайте
24
00:00:57,367 --> 00:01:01,667
haveasec.com/io
25
00:01:01,667 --> 00:01:04,200
об этой и других презентациях, посвященных Волне.
26
00:01:04,200 --> 00:01:06,200
Мы с нетерпением ждем ваших отзывов.
27
00:01:06,200 --> 00:01:08,300
А теперь — Дэвид.
28
00:01:11,467 --> 00:01:13,801
Дэвид: Спасибо, Стефани.
29
00:01:16,100 --> 00:01:17,767
Хорошо.
30
00:01:17,767 --> 00:01:20,534
Итак, вы, наверное, задумывались,
31
00:01:20,534 --> 00:01:24,200
"Что такое Волны, с технической точки зрения?"
32
00:01:24,200 --> 00:01:28,267
Волны — это, по сути, совокупность серверных XML документов,
33
00:01:28,267 --> 00:01:31,501
которые могут использоваться как для представления форматированного текста,
34
00:01:31,501 --> 00:01:34,033
так и системных данных.
35
00:01:34,033 --> 00:01:36,767
Волны также поддерживают совместную работу в реальном времени,
36
00:01:36,767 --> 00:01:38,868
вы видели это в демонстрации Ларса.
37
00:01:38,868 --> 00:01:42,801
Это означает, что с одной и той же Волной
38
00:01:42,801 --> 00:01:44,367
могут работать несколько клиентов.
39
00:01:44,367 --> 00:01:46,767
И когда в одном клиенте набирают текст, то
40
00:01:46,767 --> 00:01:48,000
в других клиентах
41
00:01:48,000 --> 00:01:50,067
можно увидеть как это происходит,
42
00:01:50,067 --> 00:01:53,667
символ за символом. И все это в реальном времени.
43
00:01:53,667 --> 00:01:57,200
Волна — это мощная и расширяемая платформа,
44
00:01:57,200 --> 00:01:59,334
для которой вы можете создавать расширения.
45
00:01:59,334 --> 00:02:00,701
И я надеюсь, вы присутствовали
46
00:02:00,701 --> 00:02:05,834
на предыдущем семинаре по расширениям.
47
00:02:05,834 --> 00:02:09,133
Ок. Вначале мы расскажем
48
00:02:09,133 --> 00:02:10,767
об управлении конкурентностью,
49
00:02:10,767 --> 00:02:14,234
которое делает возможным совместное редактирование в реальном времени.
50
00:02:14,234 --> 00:02:16,567
А затем о редакторе,
51
00:02:16,567 --> 00:02:20,467
который позволяет вводить и отображать
52
00:02:20,467 --> 00:02:22,000
буквы и символы в реальном времени.
53
00:02:22,000 --> 00:02:24,200
И в самом конце презентации
54
00:02:24,200 --> 00:02:27,467
мы расскажем о нашей классной системе проверки орфографии,
55
00:02:27,467 --> 00:02:30,667
которая стала доступной благодаря технологии Волн.
56
00:02:35,767 --> 00:02:36,968
Хорошо. Позвольте мне начать
57
00:02:36,968 --> 00:02:40,534
с управления конкурентностью.
58
00:02:40,534 --> 00:02:44,334
Итак, некоторые из вас, друзья, хорошо знакомы
59
00:02:44,334 --> 00:02:45,801
с редакторами совместного редактирования.
60
00:02:45,801 --> 00:02:47,734
Вы знаете, что уже есть несколько
61
00:02:47,734 --> 00:02:51,367
редакторов совместного редактирования.
62
00:02:51,367 --> 00:02:55,100
Есть EtherPad и есть Subetha Edit.
63
00:02:55,100 --> 00:02:58,000
Они поддерживают совместное редактирование в реальном времени,
64
00:02:58,000 --> 00:03:01,000
но не поддерживают форматированный текст
65
00:03:01,000 --> 00:03:03,033
Другие редакторы работают с форматированным текстом,
66
00:03:03,033 --> 00:03:04,834
например Google Documents,
67
00:03:04,834 --> 00:03:09,267
но они не поддерживают по-настоящему совместное редактирование в реальном времени.
68
00:03:09,267 --> 00:03:12,000
В Google Wave мы хотели реализовать обе эти возможности.
69
00:03:12,000 --> 00:03:13,234
И тогда мы обратились к технологии
70
00:03:13,234 --> 00:03:16,033
под названием "Операционное Преобразование".
71
00:03:16,033 --> 00:03:19,133
И отправной точкой для нас послужила публикация
72
00:03:19,133 --> 00:03:21,634
"High-Latency, Low-Bandwith Windowing
73
00:03:21,634 --> 00:03:24,067
in the Jupiter Collaboration System."
74
00:03:24,067 --> 00:03:26,534
Двое из четырех авторов,
75
00:03:26,534 --> 00:03:28,901
Мишель Диксон и Джон Лэмпинг,
76
00:03:28,901 --> 00:03:30,400
сейчас работают в Google,
77
00:03:30,400 --> 00:03:33,467
и они здорово помогли нам на ранней стадии разработки
78
00:03:33,467 --> 00:03:36,667
нашего варианта управления конкурентностью.
79
00:03:36,667 --> 00:03:39,434
Итак, перейдем к тому, как работает Операционное Преобразование?
80
00:03:39,434 --> 00:03:43,267
Позвольте мне объяснить это на очень простом примере.
81
00:03:43,267 --> 00:03:46,634
Представьте что есть клиент и есть сервер,
82
00:03:46,634 --> 00:03:51,901
которые хотят одновременно изменить одну и ту же часть текста "ABCDE".
83
00:03:51,901 --> 00:03:55,968
Теперь представьте, что клиент хочет удалить четвертую букву.
84
00:03:55,968 --> 00:03:59,234
В нашем примере он хочет удалить букву D.
85
00:03:59,234 --> 00:04:00,868
Итак, клиент удаляет букву
86
00:04:00,868 --> 00:04:03,400
и пересылает операцию по каналу.
87
00:04:03,400 --> 00:04:06,534
Клиент теперь находится в состоянии "ABCE".
88
00:04:06,534 --> 00:04:08,334
Клиент отсылает операцию по каналу,
89
00:04:08,334 --> 00:04:10,167
поскольку это менее затратно, чем пересылка всего документа
90
00:04:10,167 --> 00:04:11,367
по каналу.
91
00:04:11,367 --> 00:04:12,801
Сервер, в свою очередь,
92
00:04:12,801 --> 00:04:14,901
захотел в то же самое время удалить вторую букву.
93
00:04:14,901 --> 00:04:16,534
И он берёт и удаляет её.
94
00:04:16,534 --> 00:04:20,601
И переходит в состояние "ACDE".
95
00:04:20,601 --> 00:04:24,501
И эти две операции пересекаются в канале.
96
00:04:24,501 --> 00:04:27,367
Если сервер просто возьмёт и выполнит
97
00:04:27,367 --> 00:04:29,834
операцию клиента "удалить четвертую букву",
98
00:04:29,834 --> 00:04:33,634
то окажется в состоянии "ACD".
99
00:04:33,634 --> 00:04:36,968
На самом деле он выполнил бы неправильную операцию,
100
00:04:36,968 --> 00:04:38,501
в итоге, потому что он бы удалил
101
00:04:38,501 --> 00:04:39,534
не тот символ.
102
00:04:39,534 --> 00:04:40,968
Почему это произошло?
103
00:04:40,968 --> 00:04:44,701
Потому что сервер до этого уже выполнил операцию
104
00:04:44,701 --> 00:04:46,100
перед операцией "удалить четвертую букву".
105
00:04:46,100 --> 00:04:47,501
Итак, как же мы решаем эту проблему?
106
00:04:47,501 --> 00:04:49,467
Вот тут-то и выручают Операционные Преобразования.
107
00:04:49,467 --> 00:04:51,133
В Операционном Преобразовании
108
00:04:51,133 --> 00:04:54,400
есть процесс, называемый "преобразование",
109
00:04:54,400 --> 00:04:59,334
в котором рассматриваются полученные операции,
110
00:04:59,334 --> 00:05:02,801
и затем преобразовываются, относительно операций,
111
00:05:02,801 --> 00:05:04,767
которые уже были применены.
112
00:05:04,767 --> 00:05:07,367
Итак, в этом случае "удалить 4"
113
00:05:07,367 --> 00:05:09,701
преобразуется, относительно "удалить 2",
114
00:05:09,701 --> 00:05:12,234
и становится новой операцией,
115
00:05:12,234 --> 00:05:14,167
которая называется "удалить 3".
116
00:05:14,167 --> 00:05:16,200
И теперь сервер применяет эту новую операцию,
117
00:05:16,200 --> 00:05:17,501
и переходит в правильное состояние
118
00:05:17,501 --> 00:05:19,400
"ACE".
119
00:05:19,400 --> 00:05:22,367
Клиент выполняет такой же процесс преобразования.
120
00:05:22,367 --> 00:05:24,467
Оказывается, что преобразование
121
00:05:24,467 --> 00:05:27,133
операции "удалить 2" относительно "удалить 4"
122
00:05:27,133 --> 00:05:29,567
для клиента остается той же операцией "удалить 2".
123
00:05:29,567 --> 00:05:32,534
И волшебным образом и клиент, и сервер
124
00:05:32,534 --> 00:05:35,334
окажутся в одинаковом состоянии "ACE".
125
00:05:35,334 --> 00:05:38,100
Теперь, надеюсь, вы поняли, что очень важно,
126
00:05:38,100 --> 00:05:40,167
что и клиент, и сервер
127
00:05:40,167 --> 00:05:42,167
следуют в точности одинаковому алгоритму,
128
00:05:42,167 --> 00:05:43,701
преобразования операций.
129
00:05:46,267 --> 00:05:47,934
Вот более формальное определение
130
00:05:47,934 --> 00:05:49,934
Операционного Преобразования.
131
00:05:49,934 --> 00:05:53,467
Которое говорит о том, что любое изменение совместного объекта
132
00:05:53,467 --> 00:05:55,334
описывается операциями.
133
00:05:55,334 --> 00:05:56,367
К примеру:
134
00:05:56,367 --> 00:05:58,901
"вставить букву 'a' на позицию x".
135
00:05:58,901 --> 00:06:01,868
И должна существовать функция, называемая transform(),
136
00:06:01,868 --> 00:06:04,200
со следующим поведением:
137
00:06:04,200 --> 00:06:07,701
если взять операцию сервера S
138
00:06:07,701 --> 00:06:10,067
и операцию клиента C,
139
00:06:10,067 --> 00:06:12,534
то можно получить пару операций
140
00:06:12,534 --> 00:06:14,133
S' и C'
141
00:06:14,133 --> 00:06:15,934
с такими характеристиками, что
142
00:06:15,934 --> 00:06:19,501
если применить сначала серверную операцию,
143
00:06:19,501 --> 00:06:21,167
а затем
144
00:06:21,167 --> 00:06:23,000
преобразованную клиентскую операцию,
145
00:06:23,000 --> 00:06:24,534
то получится то же состояние,
146
00:06:24,534 --> 00:06:26,801
как если бы применить клиентскую операцию,
147
00:06:26,801 --> 00:06:29,400
а затем преобразованную серверную операцию.
148
00:06:29,400 --> 00:06:32,067
Итак, это можно изобразить в виде двухмерной схемы,
149
00:06:32,067 --> 00:06:33,634
справа,
150
00:06:33,634 --> 00:06:35,434
где клиент и сервер находятся в одинаковом состоянии.
151
00:06:35,434 --> 00:06:37,434
Когда клиент выполняет операцию,
152
00:06:37,434 --> 00:06:39,567
он переходит в другое состояние слева.
153
00:06:39,567 --> 00:06:41,801
А сервер выполняет свою операцию.
154
00:06:41,801 --> 00:06:44,100
И переходит в состояние справа.
155
00:06:44,100 --> 00:06:45,868
А позже они снова сойдутся,
156
00:06:45,868 --> 00:06:48,467
когда они применят преобразованные операции.
157
00:06:54,067 --> 00:06:57,868
Хорошо, итак, это диаграмма состояний
158
00:06:57,868 --> 00:07:00,934
для предыдущего примера
159
00:07:00,934 --> 00:07:02,267
на которой
160
00:07:02,267 --> 00:07:04,734
видно, что любой переход влево
161
00:07:04,734 --> 00:07:06,334
вызван операциями клиента,
162
00:07:06,334 --> 00:07:07,667
а переход вправо
163
00:07:07,667 --> 00:07:10,267
вызван операциями сервера.
164
00:07:10,267 --> 00:07:13,133
На этом примере, который вы только что видели,
165
00:07:13,133 --> 00:07:14,868
клиент идет по сплошной линии,
166
00:07:14,868 --> 00:07:17,234
сначала из состояния ADCDE,
167
00:07:17,234 --> 00:07:20,000
потом к состоянию ABCE,
168
00:07:20,000 --> 00:07:21,734
и наконец приходит к состоянию ACE.
169
00:07:21,734 --> 00:07:25,767
А сервер идёт по состояниям справа.
170
00:07:25,767 --> 00:07:27,634
Итак, это очень простой пример.
171
00:07:27,634 --> 00:07:29,367
Но в реально работающей системе,
172
00:07:29,367 --> 00:07:32,634
диаграмма состояний выглядит намного сложнее.
173
00:07:32,634 --> 00:07:34,868
Но вот что важно, на что я хочу обратить внимание,
174
00:07:34,868 --> 00:07:37,701
это то, что, как видите, клиент и сервер
175
00:07:37,701 --> 00:07:39,701
могут расходиться более чем на одну операцию.
176
00:07:39,701 --> 00:07:42,667
На самом деле, они могут разойтись на произвольное количество операций.
177
00:07:42,667 --> 00:07:44,100
И это великолепное свойство
178
00:07:44,100 --> 00:07:47,667
Операционного Преобразования, которое делает клиента независимым
179
00:07:47,667 --> 00:07:49,734
от задержек до сервера.
180
00:07:49,734 --> 00:07:52,968
Фактически, оффлайн клиент в сущности является клиентом,
181
00:07:52,968 --> 00:07:55,567
который делает вид, что у него очень долгое ожидание отклика сервера.
182
00:07:55,567 --> 00:07:57,300
И когда наконец он подключается к серверу,
183
00:07:57,300 --> 00:07:59,701
то загружает все операции и, вуаля,
184
00:07:59,701 --> 00:08:04,067
вы получаете объединенный документ .
185
00:08:04,067 --> 00:08:07,567
На данный момент мы уже внесли несколько изменений
186
00:08:07,567 --> 00:08:09,334
в протокол "Операционное Преобразование",
187
00:08:09,334 --> 00:08:12,133
которые вы можете найти в указанной литературе.
188
00:08:12,133 --> 00:08:14,834
Главное изменение, которое мы сделали в "Операционном Преобразовании"
189
00:08:14,834 --> 00:08:18,534
это то, что клиент должен ждать подтверждения
190
00:08:18,534 --> 00:08:21,567
от сервера прежде чем посылать остальные операции
191
00:08:21,567 --> 00:08:23,334
на сервер.
192
00:08:23,334 --> 00:08:24,934
Почему нам пришлось так сделать?
193
00:08:24,934 --> 00:08:26,167
Мы сделали это потому,
194
00:08:26,167 --> 00:08:28,000
что в Операционном Преобразовании
195
00:08:28,000 --> 00:08:30,000
клиент и сервер работают в паре,
196
00:08:30,000 --> 00:08:32,934
так как их пространство состояний уникально для пары.
197
00:08:32,934 --> 00:08:35,534
И это означает, что для каждого подключенного к серверу клиента
198
00:08:35,534 --> 00:08:37,334
вам нужно хранить пространство состояний для клиента.
199
00:08:37,334 --> 00:08:39,434
Если конечный клиент соединен с сервером,
200
00:08:39,434 --> 00:08:40,868
необходимо хранить пространства состояний.
201
00:08:40,868 --> 00:08:42,501
И это довольно накладно хранить их в памяти сервера
202
00:08:42,501 --> 00:08:43,968
всё время.
203
00:08:43,968 --> 00:08:47,601
Итак, заставив клиента ожидать подтверждения от сервера,
204
00:08:47,601 --> 00:08:49,434
сервер больше не обязан постоянно хранить
205
00:08:49,434 --> 00:08:51,000
эти пространства состояний,
206
00:08:51,000 --> 00:08:54,000
потому что клиент всегда подразумевает,
207
00:08:54,000 --> 00:08:55,567
где находится сервер.
208
00:08:55,567 --> 00:08:57,767
И это означает, что клиент подразумевает
209
00:08:57,767 --> 00:09:00,100
движение по пунктирной линии.
210
00:09:00,100 --> 00:09:01,501
Поступив так,
211
00:09:01,501 --> 00:09:03,567
сервер должен только преобразовывать
212
00:09:03,567 --> 00:09:04,868
принятую операцию
213
00:09:04,868 --> 00:09:08,067
относительно своей истории операций.
214
00:09:08,067 --> 00:09:10,901
Это очень прямолинейная и простая реализация сервера.
215
00:09:13,000 --> 00:09:16,200
Другое улучшение, которое мы сделали в Операционном Преобразовании -
216
00:09:16,200 --> 00:09:19,000
это возможность восстановления.
217
00:09:19,000 --> 00:09:21,367
Это означает, что при "падении" сервера,
218
00:09:21,367 --> 00:09:22,634
отключении клиента,
219
00:09:22,634 --> 00:09:25,334
и, на самом деле, при любом сбое соединения
220
00:09:25,334 --> 00:09:27,033
мы сможем восстановить исходное состояние.
221
00:09:27,033 --> 00:09:30,067
И это, возможно, одна из отправных точек
222
00:09:30,067 --> 00:09:31,901
для того, чтобы мы могли сделать оффлайн клиента.
223
00:09:31,901 --> 00:09:34,167
По существу, когда оффлайн клиент возвращается обратно в онлайн,
224
00:09:34,167 --> 00:09:35,667
то это выглядит как будто бы он отключился,
225
00:09:35,667 --> 00:09:37,000
или "упал" сервер,
226
00:09:37,000 --> 00:09:39,367
а потом просто успешно восстановился после сбоя.
227
00:09:39,367 --> 00:09:42,334
Хорошо, а сейчас позвольте мне представить Алекса Ма,
228
00:09:42,334 --> 00:09:44,501
он расскажет об операциях,
229
00:09:44,501 --> 00:09:46,701
которые мы на самом деле использовали в Google Wave,
230
00:09:46,701 --> 00:09:48,534
и в частности, о том, как мы
231
00:09:48,534 --> 00:09:53,434
сделали так, чтобы они работали по-настоящему эффективно в крупномасштабной системе.
232
00:09:53,434 --> 00:09:57,300
[аплодисменты]
233
00:09:57,300 --> 00:10:01,367
Алекс Ма: Так, э...
234
00:10:01,367 --> 00:10:05,067
Извините.
235
00:10:05,067 --> 00:10:06,734
Э...
236
00:10:06,734 --> 00:10:09,334
можно этим управлять?
237
00:10:09,334 --> 00:10:12,801
Хорошо...
238
00:10:12,801 --> 00:10:16,033
Извините.
239
00:10:16,033 --> 00:10:19,300
Мы наделили рядом интересных
240
00:10:19,300 --> 00:10:21,501
способностей наши волновые операции,
241
00:10:21,501 --> 00:10:24,000
чтобы сделать их более мощными и более эффективными.
242
00:10:24,000 --> 00:10:27,534
Одно из главных усовершенствований, которые мы сделали,
243
00:10:27,534 --> 00:10:29,767
одна из главных способностей, которую мы добавили,
244
00:10:29,767 --> 00:10:34,634
это способность любых двух последовательных операций
245
00:10:34,634 --> 00:10:36,467
объединяться друг с другом
246
00:10:36,467 --> 00:10:38,400
и образовывать другую одиночную операцию.
247
00:10:38,400 --> 00:10:39,834
Что означает,
248
00:10:39,834 --> 00:10:42,834
если есть операция A, за которой следует операция B,
249
00:10:42,834 --> 00:10:45,467
то их объединение, комбинация, B⋅A
250
00:10:45,467 --> 00:10:49,968
может быть выражена единой операцией
251
00:10:49,968 --> 00:10:55,234
...Это даёт нам...
252
00:10:55,234 --> 00:10:56,701
Можно сделать много интересных вещей,
253
00:10:56,701 --> 00:10:58,267
используя эту возможность.
254
00:10:58,267 --> 00:11:02,501
Например, используя возможность комбинирования операций,
255
00:11:02,501 --> 00:11:05,067
можно значительно ускорить
256
00:11:05,067 --> 00:11:06,400
преобразования операций.
257
00:11:06,400 --> 00:11:11,934
В традиционных системах
258
00:11:11,934 --> 00:11:15,000
Операционного Преобразования,
259
00:11:15,000 --> 00:11:18,567
когда клиент и сервер слишком сильно рассинхронизировались,
260
00:11:18,567 --> 00:11:23,367
то разрешение их состояний
261
00:11:23,367 --> 00:11:26,767
посредством управления конкурентностью может стать весьма
262
00:11:26,767 --> 00:11:28,367
накладной операцией.
263
00:11:28,367 --> 00:11:32,534
К примеру, если есть M клиентских операций
264
00:11:32,534 --> 00:11:34,367
и N серверных операций,
265
00:11:34,367 --> 00:11:35,934
и если эти M клиентских операций
266
00:11:35,934 --> 00:11:38,033
еще не были получены сервером,
267
00:11:38,033 --> 00:11:40,801
и N серверных операций
268
00:11:40,801 --> 00:11:42,234
еще не были получены клиентом,
269
00:11:42,234 --> 00:11:45,267
тогда, чтобы свести вместе конкурирующие правки
270
00:11:45,267 --> 00:11:50,834
нужно выполнить N*M преобразований.
271
00:11:50,834 --> 00:11:52,300
Это довольно много.
272
00:11:52,300 --> 00:11:54,601
Например, если есть 1000 серверных операций
273
00:11:54,601 --> 00:11:56,300
и 1000 клиентских операций,
274
00:11:56,300 --> 00:11:59,267
которые нужно преобразовать относительно друг друга,
275
00:11:59,267 --> 00:12:01,534
то это уже миллион преобразований.
276
00:12:01,534 --> 00:12:03,534
Это довольно накладно.
277
00:12:03,534 --> 00:12:07,200
Но, имея возможность,
278
00:12:07,200 --> 00:12:10,901
эффективно комбинировать операции вместе,
279
00:12:10,901 --> 00:12:12,167
вы можете на самом деле
280
00:12:12,167 --> 00:12:13,534
заранее скомбинировать вместе
281
00:12:13,534 --> 00:12:16,601
все клиентские операции
282
00:12:16,601 --> 00:12:19,501
и заранее скомбинировать все серверные операции,
283
00:12:19,501 --> 00:12:21,734
а затем произвести единственное преобразование.
284
00:12:21,734 --> 00:12:24,334
Разумеется, это усовершенствование эффективно тогда,
285
00:12:24,334 --> 00:12:28,033
когда мы можем эффективно комбинировать операции
286
00:12:28,033 --> 00:12:31,834
и трансформировать скомбинированные операции также эффективно.
287
00:12:34,100 --> 00:12:36,100
И нам в конце концов
288
00:12:36,100 --> 00:12:37,968
удалось сделать и то и другое очень эффективным.
289
00:12:37,968 --> 00:12:40,634
И теперь я собираюсь объяснить, как же мы всё-таки это сделали.
290
00:12:40,634 --> 00:12:43,901
Прежде всего, интерфейс документа -
291
00:12:43,901 --> 00:12:46,968
это интерфейс, к которому применяются операции.
292
00:12:46,968 --> 00:12:49,667
Я показываю это,
293
00:12:49,667 --> 00:12:51,467
потому что это даст вам представление о том,
294
00:12:51,467 --> 00:12:53,133
как на самом деле выглядят операции, и как они
295
00:12:53,133 --> 00:12:54,534
на самом деле работают.
296
00:12:54,534 --> 00:12:56,901
Операции фактически применяются
297
00:12:56,901 --> 00:13:00,200
к документу при помощи потока операций -
298
00:13:00,200 --> 00:13:03,667
линейно упорядоченного списка модификаций
299
00:13:03,667 --> 00:13:05,901
документа.
300
00:13:05,901 --> 00:13:08,400
Эти операции
301
00:13:08,400 --> 00:13:12,200
выглядят как упорядоченный список
302
00:13:12,200 --> 00:13:15,267
модификаций, они линейно упорядочены
303
00:13:15,267 --> 00:13:18,033
в зависимости от их положения
304
00:13:18,033 --> 00:13:19,701
в документе.
305
00:13:23,000 --> 00:13:26,267
И мы можем эффективно воспользоваться
306
00:13:26,267 --> 00:13:31,400
этой линейной упорядоченностью, чтобы комбинировать их
307
00:13:31,400 --> 00:13:34,133
простым "застёгиванием".
308
00:13:34,133 --> 00:13:36,801
Если у вас есть две операции,
309
00:13:36,801 --> 00:13:38,434
две последовательные операции
310
00:13:38,434 --> 00:13:42,467
в виде упорядоченного списка,
311
00:13:42,467 --> 00:13:44,300
то всё, что нужно сделать для их комбинирования,
312
00:13:44,300 --> 00:13:47,100
это линейно пройтись через эти два списка
313
00:13:47,100 --> 00:13:49,834
и "застегнуть" их вместе.
314
00:13:49,834 --> 00:13:52,567
Данный метод
315
00:13:52,567 --> 00:13:56,300
комбинирует
316
00:13:56,300 --> 00:13:59,934
эффект от двух операций
317
00:13:59,934 --> 00:14:03,067
очень продуктивным способом.
318
00:14:03,067 --> 00:14:05,801
это также предоставляет нам
319
00:14:05,801 --> 00:14:08,367
очень эффективный способ для преобразований,
320
00:14:08,367 --> 00:14:10,801
потому что при преобразовании,
321
00:14:10,801 --> 00:14:13,701
вместо того, чтобы просто пройтись...
322
00:14:13,701 --> 00:14:17,534
и забрать два линейных списка
323
00:14:17,534 --> 00:14:19,734
и выдать единственный линейный список,
324
00:14:19,734 --> 00:14:21,968
мы получаем на выходе два линейных списка.
325
00:14:21,968 --> 00:14:26,868
Итак, комбинирование
326
00:14:26,868 --> 00:14:28,968
и преобразование работают,
327
00:14:28,968 --> 00:14:31,901
используя очень похожие механизмы.
328
00:14:31,901 --> 00:14:33,834
Они просто принимают два
329
00:14:33,834 --> 00:14:36,400
упорядоченных списка
330
00:14:36,400 --> 00:14:39,234
одновременно и выдают
331
00:14:39,234 --> 00:14:41,367
результат.
332
00:14:41,367 --> 00:14:43,167
Так.
333
00:14:43,167 --> 00:14:47,968
И это даёт вам...
334
00:14:47,968 --> 00:14:51,033
Поскольку, при комбинировании
335
00:14:51,033 --> 00:14:54,267
двух операций...
336
00:14:54,267 --> 00:14:56,968
небольшие модификации
337
00:14:56,968 --> 00:14:59,067
в двух операциях могут на самом деле перекрываться
338
00:14:59,067 --> 00:15:02,200
и накладываться друг на друга,
339
00:15:02,200 --> 00:15:05,434
то вы не можете "застёгнуть" вместе эти модификации напрямую.
340
00:15:05,434 --> 00:15:08,067
Для этого нужно сделать правильное "застёгивание",
341
00:15:08,067 --> 00:15:10,434
наподобие того, как вы бы делали "застёгивание"
342
00:15:10,434 --> 00:15:13,367
в функциональных...
343
00:15:13,367 --> 00:15:16,300
в функциональных языках программирования.
344
00:15:16,300 --> 00:15:19,100
Если вы знакомы с функциональными языками программирования,
345
00:15:19,100 --> 00:15:20,767
то вы, наверное, знаете, что zip-функции
346
00:15:20,767 --> 00:15:22,367
используются достаточно часто .
347
00:15:22,367 --> 00:15:25,133
Но...
348
00:15:25,133 --> 00:15:26,434
на самом деле здесь происходит вот что...
349
00:15:26,434 --> 00:15:30,200
Если вы посмотрите на диаграмму, то
350
00:15:30,200 --> 00:15:33,701
на верхней линейке диаграммы... Диаграмма изображает
351
00:15:33,701 --> 00:15:37,634
документ до применения первой операции.
352
00:15:37,634 --> 00:15:40,033
Горизонтальная линейка в центре
353
00:15:40,033 --> 00:15:42,033
отображает документ после применения
354
00:15:42,033 --> 00:15:43,133
первой операции.
355
00:15:43,133 --> 00:15:46,000
А нижняя линейка
356
00:15:46,000 --> 00:15:49,000
изображает документ после применения
357
00:15:49,000 --> 00:15:50,801
второй операции.
358
00:15:50,801 --> 00:15:54,334
Итак, эти белые четырехугольники представляют собой
359
00:15:54,334 --> 00:15:59,400
содержимое, к которому не применяются операции.
360
00:15:59,400 --> 00:16:04,801
Оранжевые треугольники -
361
00:16:04,801 --> 00:16:07,400
это содержимое, которое было удалено.
362
00:16:07,400 --> 00:16:09,467
А зелёные треугольники представляют содержимое,
363
00:16:09,467 --> 00:16:12,100
которое было добавлено в документ.
364
00:16:12,100 --> 00:16:15,934
Итак...
365
00:16:15,934 --> 00:16:17,367
эти горизонтальные линейки -
366
00:16:17,367 --> 00:16:20,801
просто линейные представления документа.
367
00:16:20,801 --> 00:16:22,267
Это вообще-то
368
00:16:22,267 --> 00:16:24,601
очень сильно упрощённый вид документа.
369
00:16:24,601 --> 00:16:26,167
На самом деле наши реальные документы
370
00:16:26,167 --> 00:16:27,767
гораздо более сложные.
371
00:16:27,767 --> 00:16:30,234
Но в качестве иллюстрации,
372
00:16:30,234 --> 00:16:33,834
это то, как примерно выглядят документы .
373
00:16:33,834 --> 00:16:37,834
Итак, мы разделяем эти
374
00:16:37,834 --> 00:16:43,000
операции на мелкие кусочки,
375
00:16:43,000 --> 00:16:45,901
так, чтобы можно было точно сопоставить
376
00:16:45,901 --> 00:16:48,067
каждый кусочек сверху, в первой операции,
377
00:16:48,067 --> 00:16:49,901
с каждым кусочком во второй операции.
378
00:16:49,901 --> 00:16:54,200
Вот, что изображено на нижней диаграмме.
379
00:16:54,200 --> 00:16:56,868
И теперь мы хорошенько склеиваем
380
00:16:56,868 --> 00:16:58,667
верхнюю и нижнюю операцию вместе
381
00:16:58,667 --> 00:17:01,234
с документом в середине.
382
00:17:01,234 --> 00:17:03,067
И если представить, что
383
00:17:03,067 --> 00:17:06,234
операции - это маленькие кусочки резинки,
384
00:17:06,234 --> 00:17:07,868
то если вы наклеите их вдоль средней линейки
385
00:17:07,868 --> 00:17:09,200
и отпустите эти резинки,
386
00:17:09,200 --> 00:17:10,434
то получите что-то вроде
387
00:17:10,434 --> 00:17:13,701
нижней схемы.
388
00:17:13,701 --> 00:17:16,901
И это даёт вам наглядное представление
389
00:17:16,901 --> 00:17:19,133
о том, какие кусочки
390
00:17:19,133 --> 00:17:20,634
первой операции
391
00:17:20,634 --> 00:17:22,667
сопоставляются каким кусочкам второй операции.
392
00:17:22,667 --> 00:17:26,701
Вот, например, два куска "A" -
393
00:17:26,701 --> 00:17:27,968
это содержимое документа, которое не изменяется.
394
00:17:27,968 --> 00:17:31,200
Их комбинация - это один блок "A", который также представляет собой
395
00:17:31,200 --> 00:17:32,968
неизменяемое содержимое.
396
00:17:32,968 --> 00:17:35,133
Если содержимое удалено
397
00:17:35,133 --> 00:17:36,534
либо первой операцией,
398
00:17:36,534 --> 00:17:39,033
либо второй операцией, то такое содержимое
399
00:17:39,033 --> 00:17:41,968
остаётся удалённым и при их комбинировании.
400
00:17:41,968 --> 00:17:44,667
Ок. Содержимое удалено
401
00:17:44,667 --> 00:17:45,701
их комбинацией
402
00:17:45,701 --> 00:17:47,501
А если что-то вставлено
403
00:17:47,501 --> 00:17:49,167
первой или второй операцией,
404
00:17:49,167 --> 00:17:53,667
тогда это содержимое будет вставлено и их
405
00:17:53,667 --> 00:17:55,033
комбинацией.
406
00:17:55,033 --> 00:17:58,467
Вот интересный кусок, это "K",
407
00:17:58,467 --> 00:18:01,934
Что представляет "K"?
408
00:18:01,934 --> 00:18:04,000
"K" - это содержимое, которое было добавлено
409
00:18:04,000 --> 00:18:05,100
первой операцией,
410
00:18:05,100 --> 00:18:06,901
но удалено второй операцией.
411
00:18:06,901 --> 00:18:10,968
Когда вы склеиваете их вместе,
412
00:18:10,968 --> 00:18:12,601
они просто исчезают.
413
00:18:12,601 --> 00:18:15,901
Вот почему "K" нет на нижней схеме.
414
00:18:15,901 --> 00:18:19,567
Это даёт вам более подробное представление
415
00:18:19,567 --> 00:18:24,267
о том, как мы достигли эффективного комбинирования операций.
416
00:18:24,267 --> 00:18:27,000
Что ещё интересного
417
00:18:27,000 --> 00:18:29,267
вы можете сделать с деревом комбинаций...
418
00:18:29,267 --> 00:18:30,667
Простите.
419
00:18:30,667 --> 00:18:33,400
Также интересным применением комбинаций
420
00:18:33,400 --> 00:18:35,167
является создание дерева комбинаций.
421
00:18:35,167 --> 00:18:38,367
И вот каким способом можно создать дерево комбинаций.
422
00:18:38,367 --> 00:18:43,901
Предположим, есть линейная последовательность операций.
423
00:18:43,901 --> 00:18:46,934
Всё что надо, -- это сгруппировать
424
00:18:46,934 --> 00:18:50,601
каждую из этих операций в пары,
425
00:18:50,601 --> 00:18:53,167
затем объединить пары и получить следующий верхний уровень
426
00:18:53,167 --> 00:18:54,501
дерева.
427
00:18:54,501 --> 00:18:56,534
Таким образом, все операции
428
00:18:56,534 --> 00:19:00,601
в последовательности образуют вершину
429
00:19:00,601 --> 00:19:02,067
дерева.
430
00:19:02,067 --> 00:19:04,067
Вы комбинируете операции в каждой соседней паре,
431
00:19:04,067 --> 00:19:06,234
чтобы получить следующий верхний уровень.
432
00:19:06,234 --> 00:19:10,567
И так далее выше по уровням.
433
00:19:10,567 --> 00:19:13,834
Для каждого уровня просто комбинируются операции
434
00:19:13,834 --> 00:19:15,634
из нижнего уровня.
435
00:19:15,634 --> 00:19:17,734
И так получается дерево,
436
00:19:17,734 --> 00:19:22,234
в котором каждый узел представляет комбинацию
437
00:19:22,234 --> 00:19:24,434
двух дочерних узлов.
438
00:19:24,434 --> 00:19:27,267
И с помощью этой структуры данных
439
00:19:27,267 --> 00:19:29,033
можно перепрыгивать
440
00:19:29,033 --> 00:19:32,234
из любой точки истории в другую,
441
00:19:32,234 --> 00:19:35,234
используя всего лишь логарифмическое количество операций.
442
00:19:35,234 --> 00:19:39,334
Работает ли это?
443
00:19:39,334 --> 00:19:41,501
Итак, например,
444
00:19:41,501 --> 00:19:43,200
если надо перескочить из точки
445
00:19:43,200 --> 00:19:44,434
непосредственно перед операцией 4
446
00:19:44,434 --> 00:19:47,067
в точку сразу за операцией 14,
447
00:19:47,067 --> 00:19:51,267
то потребуется применить только 4 операции.
448
00:19:51,267 --> 00:19:56,067
Это огромная экономия. Если..
449
00:19:56,067 --> 00:19:59,634
Если надо воспроизвести историю операций,
450
00:19:59,634 --> 00:20:00,901
--перескочить в любую точку--
451
00:20:00,901 --> 00:20:04,033
Если надо воспроизвести историю операций,
452
00:20:04,033 --> 00:20:06,667
и нужно перескочить в любую точку в ней,
453
00:20:06,667 --> 00:20:08,901
то потребуется всего лишь логарифмическое количество операций,
454
00:20:08,901 --> 00:20:10,701
чтобы перепрыгнуть в эту точку.
455
00:20:10,701 --> 00:20:12,033
Если нужно найти различия
456
00:20:12,033 --> 00:20:14,234
между любыми двумя точками
457
00:20:14,234 --> 00:20:17,100
в истории, то просто
458
00:20:17,100 --> 00:20:20,634
произведите логарифмическое число операций,
459
00:20:20,634 --> 00:20:22,133
которое представляют
460
00:20:22,133 --> 00:20:24,501
скачок между этими точками,
461
00:20:24,501 --> 00:20:26,901
скомбинируйте их вместе, и получите различия
462
00:20:26,901 --> 00:20:29,033
между этими двумя точками.
463
00:20:29,033 --> 00:20:30,934
Так что это очень, очень эффективный
464
00:20:30,934 --> 00:20:34,033
метод для перемещения от операции к операции.
465
00:20:34,033 --> 00:20:37,267
Ну, вот, это
466
00:20:37,267 --> 00:20:38,801
конец моей части доклада,
467
00:20:38,801 --> 00:20:43,734
и я передаю слово Дэну, который работал над редактором.
468
00:20:43,734 --> 00:20:47,334
[аплодисменты]
469
00:20:50,100 --> 00:20:51,501
Спасибо, Алекс.
470
00:20:51,501 --> 00:20:53,234
Всем привет. Я Дэн.
471
00:20:53,234 --> 00:20:56,434
Итак, Дэйв и Алекс только что бегло обрисовали вам
472
00:20:56,434 --> 00:20:59,434
то, как мы используем управление конкурентностью
473
00:20:59,434 --> 00:21:01,200
и Операционное Преобразование,
474
00:21:01,200 --> 00:21:04,767
чтобы смешивать операциями между клиентами и агентами.
475
00:21:04,767 --> 00:21:08,634
И во главе у нас
476
00:21:08,634 --> 00:21:10,234
находится редактор.
477
00:21:10,234 --> 00:21:13,100
Он источник этих операций.
478
00:21:13,100 --> 00:21:15,767
Давайте рассмотрим это на примерах.
479
00:21:15,767 --> 00:21:17,467
Вы видите редактор, который находится поверх всего этого.
480
00:21:17,467 --> 00:21:19,868
Он просто получает поток операций,
481
00:21:19,868 --> 00:21:23,334
входящий и исходящий из него.
482
00:21:23,334 --> 00:21:25,400
Итак, какие свойства...
483
00:21:25,400 --> 00:21:26,567
Какие цели преследует
484
00:21:26,567 --> 00:21:27,801
редактор?
485
00:21:27,801 --> 00:21:29,300
Вы, ребята, видели демо, я полагаю,
486
00:21:29,300 --> 00:21:31,334
и те вещи,
487
00:21:31,334 --> 00:21:33,767
которые мы бы хотели, чтобы редактор умел делать.
488
00:21:33,767 --> 00:21:36,601
Очевидно, что мы хотим обеспечить высокий уровень модульности
489
00:21:36,601 --> 00:21:38,601
извлечения и применения
490
00:21:38,601 --> 00:21:41,467
исходящих и входящих операций.
491
00:21:41,467 --> 00:21:42,934
В то же время,
492
00:21:42,934 --> 00:21:46,400
мы хотели бы получить поддержку форматированного текста и мультимедиа.
493
00:21:46,400 --> 00:21:49,267
И хотели бы сделать редактор расширяемым.
494
00:21:49,267 --> 00:21:51,267
Чтобы разработчики могли дополнять его
495
00:21:51,267 --> 00:21:53,467
с помощью различных виджетов, гаджетов,
496
00:21:53,467 --> 00:21:55,467
и так далее.
497
00:21:55,467 --> 00:21:59,200
Для успешной работы
498
00:21:59,200 --> 00:22:01,467
с таким богатым окружением
499
00:22:01,467 --> 00:22:02,834
не обязательно
500
00:22:02,834 --> 00:22:05,567
использовать HTML в качестве нашего формата данных.
501
00:22:05,567 --> 00:22:07,100
Нашей целью было определить
502
00:22:07,100 --> 00:22:08,334
абстрактную модель данных.
503
00:22:08,334 --> 00:22:09,534
И мы добились своей цели.
504
00:22:09,534 --> 00:22:11,400
Поэтому задача редактора в преобразовании разных форматов данных
505
00:22:11,400 --> 00:22:13,567
и отображении в формате
506
00:22:13,567 --> 00:22:16,501
HTML, поскольку вы находитесь в браузере.
507
00:22:16,501 --> 00:22:18,701
Более того,
508
00:22:18,701 --> 00:22:20,968
мы хотим полностью контролировать происходящее.
509
00:22:20,968 --> 00:22:22,601
Мы не хотим идти на поводу у браузера.
510
00:22:22,601 --> 00:22:24,734
Наша цель - дать полное представление,
511
00:22:24,734 --> 00:22:27,200
о том, что такое интерактивный интерфейс.
512
00:22:27,200 --> 00:22:31,234
Поддержка различных языков также имеет очень большое значение.
513
00:22:31,234 --> 00:22:32,667
Таким образом мы хотим осуществить поддержку RTL,
514
00:22:32,667 --> 00:22:35,467
редактора метода ввода и так далее.
515
00:22:35,467 --> 00:22:36,801
Так как же мы это всё осуществили?
516
00:22:36,801 --> 00:22:38,901
Ок. Сперва, мы выбрали в качестве документной модели
517
00:22:38,901 --> 00:22:43,033
XML и аннотации.
518
00:22:43,033 --> 00:22:45,100
Итак, XML,
519
00:22:45,100 --> 00:22:47,567
был взят в качестве основы нашего документа,
520
00:22:47,567 --> 00:22:50,901
а аннотацию блоков XML мы выолняем
521
00:22:50,901 --> 00:22:53,000
с помощью аннотаций.
522
00:22:53,000 --> 00:22:54,834
Вот простой пример.
523
00:22:54,834 --> 00:22:57,100
Сейчас я немного расскажу об аннотациях
524
00:22:57,100 --> 00:23:00,734
на вот таком простом примере.
525
00:23:00,734 --> 00:23:03,601
В нашем демо, которое вы видели,
526
00:23:03,601 --> 00:23:05,934
мы загружали несколько изображений в Волну.
527
00:23:05,934 --> 00:23:07,334
Вот к примеру.
528
00:23:07,334 --> 00:23:09,367
И это очень просто, как вы видите.
529
00:23:09,367 --> 00:23:10,767
w:image - это просто
530
00:23:10,767 --> 00:23:12,400
произвольно выбранное нами пространство имен,
531
00:23:12,400 --> 00:23:14,501
а также вложение
532
00:23:14,501 --> 00:23:15,968
и заголовок.
533
00:23:15,968 --> 00:23:17,467
Это легко и просто.
534
00:23:17,467 --> 00:23:19,334
А это HTML для этого XML.
535
00:23:19,334 --> 00:23:22,334
Вам не хотелось бы иметь это в вашей модели даных.
536
00:23:22,334 --> 00:23:25,400
Аннотации, как я говорил ранее, это просто
537
00:23:25,400 --> 00:23:29,834
по сути пары ключ-значение для блоков документа.
538
00:23:29,834 --> 00:23:32,067
Каждый элемент
539
00:23:32,067 --> 00:23:34,634
документа - это открывающий тег, символ
540
00:23:34,634 --> 00:23:35,834
и закрывающий тэг.
541
00:23:35,834 --> 00:23:37,834
Каждый элемент документа по сути имеет таблицу
542
00:23:37,834 --> 00:23:38,968
пар ключ-значение.
543
00:23:38,968 --> 00:23:40,367
Но если элементы следуют друг за другом и непрерывны,
544
00:23:40,367 --> 00:23:41,901
то их можно рассматривать как диапазоны.
545
00:23:41,901 --> 00:23:43,801
Вот красный текст,
546
00:23:43,801 --> 00:23:45,400
и ссылка поверх него.
547
00:23:45,400 --> 00:23:47,801
Отличное свойство аннотаций в том,
548
00:23:47,801 --> 00:23:50,067
что они могут накладываться,
549
00:23:50,067 --> 00:23:52,234
и не влиять на размер содержимого.
550
00:23:52,234 --> 00:23:54,801
Итак если бы нам пришлось писать все эти
551
00:23:54,801 --> 00:23:56,968
и теги здесь,
552
00:23:56,968 --> 00:23:58,467
то они бы некрасиво накладывались.
553
00:23:58,467 --> 00:23:59,801
Нам бы пришлось разделять их.
554
00:23:59,801 --> 00:24:01,501
А это сказалось бы на нашей структуре
555
00:24:01,501 --> 00:24:02,601
XML.
556
00:24:02,601 --> 00:24:03,934
Клиенты могут не обращать внимание на аннотации,
557
00:24:03,934 --> 00:24:05,200
которые их не интересуют.
558
00:24:05,200 --> 00:24:07,000
Если, например, вам неинтересны орфографические аннотации
559
00:24:07,000 --> 00:24:08,400
то вы просто не отображаете их.
560
00:24:08,400 --> 00:24:09,667
Если надо - отображаете.
561
00:24:09,667 --> 00:24:14,234
Если вы заметили курсоры редактирования
562
00:24:14,234 --> 00:24:16,767
и подсветку того, что выделили другие люди,
563
00:24:16,767 --> 00:24:18,701
то знайте, для этого мы также используем аннотации.
564
00:24:18,701 --> 00:24:22,234
Да, многофункциональные ссылки.
Специфические данные для роботов.
565
00:24:22,234 --> 00:24:24,434
Например, если метаданные не должны быть отображены,
566
00:24:24,434 --> 00:24:27,100
то решать как интерпретировать эти данные должен
567
00:24:27,100 --> 00:24:28,767
клиент или робот.
568
00:24:28,767 --> 00:24:31,200
Также выделение отличий.
569
00:24:31,200 --> 00:24:33,634
Аннотации могут,
570
00:24:33,634 --> 00:24:35,567
содержать ссылки
571
00:24:35,567 --> 00:24:36,868
на данные
572
00:24:36,868 --> 00:24:39,334
в другом документе.
573
00:24:39,334 --> 00:24:42,501
Ок, а как мы преобразовываем это всё
574
00:24:42,501 --> 00:24:44,367
из XML в HTML?
575
00:24:44,367 --> 00:24:46,200
XSLT-ит кто-нибудь?
576
00:24:46,200 --> 00:24:47,434
хе хе хе
577
00:24:47,434 --> 00:24:49,400
Ну, мы-то так не делаем.
578
00:24:49,400 --> 00:24:50,400
Мы...
579
00:24:50,400 --> 00:24:52,167
[смех в зале]
580
00:24:52,167 --> 00:24:56,033
Мы используем тесную связь...
581
00:24:56,033 --> 00:24:58,300
В общем у нас есть DOM
582
00:24:58,300 --> 00:25:00,968
в виде XML.
583
00:25:00,968 --> 00:25:04,100
А в браузере мы применяем тесную связь
584
00:25:04,100 --> 00:25:07,400
между XML и соответствующим HTML отображением.
585
00:25:07,400 --> 00:25:09,400
Фактически это ссылки на объекты.
586
00:25:09,400 --> 00:25:12,300
Итак, по умолчанию, где... где наша модель такая же...
587
00:25:12,300 --> 00:25:14,067
так P для абзаца и текстовых узлов
588
00:25:14,067 --> 00:25:15,167
и так далее...
589
00:25:15,167 --> 00:25:16,801
когда так совпадает с HTML, то
590
00:25:16,801 --> 00:25:18,067
получается очень эффективно.
591
00:25:18,067 --> 00:25:20,167
Когда вы хотите присоединить потомка к XML,
592
00:25:20,167 --> 00:25:22,167
то просто соответствующий HTML узел
593
00:25:22,167 --> 00:25:24,834
присоединяется в соответствующее место DOM.
594
00:25:24,834 --> 00:25:26,033
Это происходит очень быстро.
595
00:25:26,033 --> 00:25:29,801
Но если вы хотите сделать что-то посложнее,
596
00:25:29,801 --> 00:25:31,300
то никаких проблем не возникнет.
597
00:25:31,300 --> 00:25:33,667
Так, в примере с эскизами изображений,
598
00:25:33,667 --> 00:25:35,601
снова, у нас есть изображение, соответствующее div-у
599
00:25:35,601 --> 00:25:37,367
а тут что-то очень сложное.
600
00:25:37,367 --> 00:25:39,634
И этот атрибут здесь ссылается на этот источник,
601
00:25:39,634 --> 00:25:40,834
описывающий изображение.
602
00:25:40,834 --> 00:25:44,634
Так вы можете определить любое настраиваемое отображение,
603
00:25:44,634 --> 00:25:47,000
которое только пожелаете.
604
00:25:47,000 --> 00:25:49,167
А теперь - еще немного о аннотациях.
605
00:25:49,167 --> 00:25:50,234
Итак... итак у нас есть содержимое,
606
00:25:50,234 --> 00:25:52,434
и мы хотим вот так его аннотировать.
607
00:25:52,434 --> 00:25:55,234
У нас, ага, грамматическая ошибка тут.
608
00:25:55,234 --> 00:25:57,200
У нас есть ссылка.
609
00:25:57,200 --> 00:25:59,667
Ага, некоторый стилизованный текст с перекрывающимися стилями.
610
00:25:59,667 --> 00:26:01,033
мы аннотируем их,
611
00:26:01,033 --> 00:26:03,734
и аннотации удачно перекрылись.
612
00:26:03,734 --> 00:26:05,167
И мы хотим, чтобы оно отобразилось вот так.
613
00:26:05,167 --> 00:26:06,901
Я хочу подчеркнуть тот факт, что мы хотим
614
00:26:06,901 --> 00:26:09,067
отобразить его именно так, только
615
00:26:09,067 --> 00:26:10,501
из-за особенностей нашего клиента.
616
00:26:10,501 --> 00:26:12,000
Вы можете отобразить эту информацию
617
00:26:12,000 --> 00:26:13,534
так, как пожелаете.
618
00:26:13,534 --> 00:26:15,801
Мы осуществляем это с помощью
619
00:26:15,801 --> 00:26:18,367
маленькой утилиты в редакторе,
620
00:26:18,367 --> 00:26:20,234
которая делает проход
621
00:26:20,234 --> 00:26:24,701
и преобразовывает эти примечания
622
00:26:24,701 --> 00:26:28,767
в дополнительный XML,
который хранится локально.
623
00:26:28,767 --> 00:26:30,100
И не отправляется на сервер.
624
00:26:30,100 --> 00:26:31,701
И так разрешаются все
625
00:26:31,701 --> 00:26:34,000
перекрывающиеся примечания.
626
00:26:34,000 --> 00:26:35,767
Вот тут у нас есть полужирный текст,
627
00:26:35,767 --> 00:26:38,300
полужирный курсив
и просто курсив.
628
00:26:38,300 --> 00:26:40,834
А вот - дополнительный узел для управления
629
00:26:40,834 --> 00:26:42,934
маленьким выпадающим списком
так, как мы и хотели.
630
00:26:42,934 --> 00:26:44,467
И теперь для отображения этого всего в HTML
631
00:26:44,467 --> 00:26:46,000
мы делаем то, что я показывал раньше,
632
00:26:46,000 --> 00:26:48,767
где у нас было хорошее,
обычно "один-к-одному",
633
00:26:48,767 --> 00:26:51,934
но часто и произвольное соответствие.
634
00:26:51,934 --> 00:26:53,434
Хорошо, итак, короткое резюме.
635
00:26:53,434 --> 00:26:57,467
Из документа к HTML DOM
у нас есть быстрый путь,
636
00:26:57,467 --> 00:26:59,267
который полезен,
637
00:26:59,267 --> 00:27:01,133
когда вы много нажимаете ВВОД или печатаете,
638
00:27:01,133 --> 00:27:02,300
или используете backspace.
639
00:27:02,300 --> 00:27:03,767
Но также
640
00:27:03,767 --> 00:27:06,033
вы можете сделать собственную обработку изменений
641
00:27:06,033 --> 00:27:07,701
и отображения.
642
00:27:07,701 --> 00:27:10,033
Это же может быть использовано
для отображения на стороне сервера
643
00:27:10,033 --> 00:27:11,968
и так далее - не только в редакторе.
644
00:27:11,968 --> 00:27:14,334
Хорошо, теперь - другая сторона монеты -
645
00:27:14,334 --> 00:27:15,868
это извлечение операций.
646
00:27:15,868 --> 00:27:17,567
Так как же мы это делаем?
647
00:27:17,567 --> 00:27:21,534
Итак, на первом шаге
648
00:27:21,534 --> 00:27:24,167
мы
649
00:27:24,167 --> 00:27:27,234
сделаем небольшой тест
650
00:27:27,234 --> 00:27:32,334
... итак я получил события.
651
00:27:32,334 --> 00:27:34,601
Хорошо. Я получил их.
А теперь здесь я нажимаю клавишу.
652
00:27:34,601 --> 00:27:37,000
И DOM изменяется.
653
00:27:37,000 --> 00:27:41,267
А теперь, скажем, я хочу печатать по-китайски.
654
00:27:41,267 --> 00:27:45,934
Начинаю печатать и, замечательно, браузер сначала изменил DOM,
655
00:27:45,934 --> 00:27:47,968
а потом выдал мне событие по клавише.
656
00:27:47,968 --> 00:27:49,167
Как удобно.
657
00:27:49,167 --> 00:27:50,367
Итак, не важно,
658
00:27:50,367 --> 00:27:52,434
так вы... вы представьте всё это сначала
659
00:27:52,434 --> 00:27:56,200
а потом... а потом вы... вы решаете
660
00:27:56,200 --> 00:27:59,701
хорошо, некоторые из этих вещей
браузер делает замечательно.
661
00:27:59,701 --> 00:28:01,634
с другими не все так гладко.
662
00:28:01,634 --> 00:28:04,133
Так, например, маркеры элементов списка
это известный пример.
663
00:28:04,133 --> 00:28:05,634
С некоторыми вещами
мы не можем справиться.
664
00:28:05,634 --> 00:28:06,834
Типа ввода IME.
665
00:28:06,834 --> 00:28:08,300
Если вы получаете
событие по клавише,
666
00:28:08,300 --> 00:28:10,567
то это не говорит вам о том,
что делает пользователь.
667
00:28:10,567 --> 00:28:13,100
мы пытаемся найти
золотую середину,
668
00:28:13,100 --> 00:28:16,367
позволив браузеру
669
00:28:16,367 --> 00:28:20,100
делать своё дело
в contentEditable области,
670
00:28:20,100 --> 00:28:24,200
и управляя событиями
самостоятельно.
671
00:28:24,200 --> 00:28:29,100
Итак, вот
краткое резюме.
672
00:28:29,100 --> 00:28:30,901
Браузер что-то делает.
673
00:28:30,901 --> 00:28:32,501
Мы получаем события.
674
00:28:32,501 --> 00:28:34,567
Иногда происходят
произвольные вещи.
675
00:28:34,567 --> 00:28:38,334
И наш маршрутизатор событий решает направить это
676
00:28:38,334 --> 00:28:43,067
обработчикам
или уведомить процессы извлечения--
677
00:28:43,067 --> 00:28:44,667
Это я быстро очень быстро промотаю--
678
00:28:44,667 --> 00:28:48,033
извините,
которые проверяют HTML,
679
00:28:48,033 --> 00:28:49,601
а затем соответственно изменяют нашу модель.
680
00:28:49,601 --> 00:28:51,534
Если это попадает к обработчику,
681
00:28:51,534 --> 00:28:53,567
то мы просто непосредственно изменяем документ,
682
00:28:53,567 --> 00:28:55,300
который потом отражает изменения в HTML.
683
00:28:55,300 --> 00:28:57,968
Для примера я покажу маленькое демо
684
00:28:57,968 --> 00:29:01,534
в надежде проиллюстрировать это чуть лучше.
685
00:29:01,534 --> 00:29:06,934
Это...
686
00:29:06,934 --> 00:29:09,000
это маленькая демонстрация двух редакторов.
687
00:29:09,000 --> 00:29:10,467
С одной стороны у меня - один,
и один - с другой.
688
00:29:10,467 --> 00:29:12,167
Я просто печатаю.
Что-то появляется.
689
00:29:12,167 --> 00:29:16,267
Можете увидеть, у нас P здесь
и P здесь.
690
00:29:16,267 --> 00:29:19,801
А этот дополнительный BR
нужен только для Firefox
691
00:29:19,801 --> 00:29:21,234
это просто ему нужно.
692
00:29:21,234 --> 00:29:22,601
Если это просто HTML,
693
00:29:22,601 --> 00:29:24,601
мы не должны хранить это
в нашем содержимом.
694
00:29:24,601 --> 00:29:29,133
Итак, как вы можете видеть,
695
00:29:29,133 --> 00:29:33,534
вот, снизу,
у нас есть процесс извлечения, с уведомлениями
696
00:29:33,534 --> 00:29:37,000
затем мы получаем
оттуда операции.
697
00:29:37,000 --> 00:29:41,601
Когда бы я не нажал клавишу ввода, как видите,
698
00:29:41,601 --> 00:29:43,267
мы предотвращаем
это событие.
699
00:29:43,267 --> 00:29:44,734
Нам не нужно,
чтобы браузер
700
00:29:44,734 --> 00:29:47,033
делал это потому, что так
он запортит DOM.
701
00:29:47,033 --> 00:29:50,400
Вместо этого, мы делаем это
сами программно.
702
00:29:50,400 --> 00:29:54,400
Это и был кратенький обзор.
703
00:29:54,400 --> 00:29:57,033
Вот... и резюме.
704
00:29:57,033 --> 00:30:00,501
и я... да.
705
00:30:00,501 --> 00:30:02,801
Итак, в итоге,
что мы сделали,
706
00:30:02,801 --> 00:30:06,934
мы получили редактор,
который позволяет использовать произвольное сопоставление
707
00:30:06,934 --> 00:30:10,167
некой документной модели,
которую мы выбрали, в HTML
708
00:30:10,167 --> 00:30:13,534
и подробное извлечение операций.
709
00:30:13,534 --> 00:30:16,501
И мы помогаем браузеру везде,
где возможно для отображения
710
00:30:16,501 --> 00:30:18,701
или например для IME поддержки.
711
00:30:18,701 --> 00:30:21,734
Но для других вещей,
где возможно,
712
00:30:21,734 --> 00:30:23,667
где браузер не делает то,
что нам нужно,
713
00:30:23,667 --> 00:30:26,667
мы просто обрабатываем это
программно сами.
714
00:30:26,667 --> 00:30:30,267
Итак, надеюсь, вы получили краткое представление.
715
00:30:30,267 --> 00:30:32,701
А сейчас
я представлю Кейси,
716
00:30:32,701 --> 00:30:34,501
который расскажет
обо всех крутых вещах
717
00:30:34,501 --> 00:30:37,667
которые вы можете сделать,
собрав всё это вместе.
718
00:30:37,667 --> 00:30:42,367
[аплодисменты]
719
00:30:42,367 --> 00:30:43,968
Cпасибо, Дэн.
720
00:30:43,968 --> 00:30:45,234
Итак, я - Кейси.
721
00:30:45,234 --> 00:30:47,300
Я работаю в команде по обработки естественных языков
722
00:30:47,300 --> 00:30:49,834
для Волны.
723
00:30:49,834 --> 00:30:50,834
У нас была
724
00:30:50,834 --> 00:30:52,100
команда по обработке естественных языков
725
00:30:52,100 --> 00:30:53,267
с самого начала.
726
00:30:53,267 --> 00:30:54,667
И я думаю это очень интересно.
727
00:30:54,667 --> 00:30:56,234
Я расскажу об этом немного больше.
728
00:30:56,234 --> 00:30:58,767
Мне повезло, потому что всю самую тяжелую работу
729
00:30:58,767 --> 00:30:59,834
сделали до меня.
730
00:30:59,834 --> 00:31:01,801
Эти ребята предоставили мне систему
731
00:31:01,801 --> 00:31:04,701
в которой уже есть
732
00:31:04,701 --> 00:31:06,601
управление конкурентностью, редактирование в реальном времени,
733
00:31:06,601 --> 00:31:09,000
и потрясающий редактор.
734
00:31:09,000 --> 00:31:11,133
Итак, сегодня я расскажу
735
00:31:11,133 --> 00:31:15,167
главным образом об орфографии,
736
00:31:15,167 --> 00:31:17,300
о которой, я надеюсь, вы слышали на презентации этим утром.
737
00:31:17,300 --> 00:31:18,968
Но также, на примере этого, я хочу показать
738
00:31:18,968 --> 00:31:22,267
как создать утилиты для Волны.
739
00:31:22,267 --> 00:31:23,934
Это то, от чего лично
740
00:31:23,934 --> 00:31:25,033
я в восторге.
741
00:31:25,033 --> 00:31:26,334
Так же я хочу, чтобы вы помнили,
742
00:31:26,334 --> 00:31:27,701
пока я рассказываю об орфографии,
743
00:31:27,701 --> 00:31:29,567
что это касается не только орфографии.
744
00:31:29,567 --> 00:31:31,667
Итак, свойство Волны в том...
745
00:31:31,667 --> 00:31:33,133
Я действительно думаю, что Волна
746
00:31:33,133 --> 00:31:36,234
это отличная платформа для построения более хитрого инструментария.
747
00:31:36,234 --> 00:31:38,400
Основанием для этого служит, прежде всего
748
00:31:38,400 --> 00:31:39,934
ее структура.
749
00:31:39,934 --> 00:31:41,400
Как мы говорили,
750
00:31:41,400 --> 00:31:44,300
XML Волны с аннотациями к нему
751
00:31:44,300 --> 00:31:46,234
...позволяет вам представлять
информацию,
752
00:31:46,234 --> 00:31:48,367
которую вы хотите поместить
в Волну, непосредственно, верно?
753
00:31:48,367 --> 00:31:49,968
Так что мы не храним какой-либо HTML.
754
00:31:49,968 --> 00:31:51,033
Мы не храним обычный текст.
755
00:31:51,033 --> 00:31:52,367
Вы можете поместить любое содержимое--
756
00:31:52,367 --> 00:31:53,701
ведь это - XML, а значит, он - расширяем--
757
00:31:53,701 --> 00:31:54,734
прямо тут - в Волне,
758
00:31:54,734 --> 00:31:56,400
а затем вы можете работать совместно над содержимым.
759
00:31:56,400 --> 00:31:58,400
Во-вторых - совместная работа.
760
00:31:58,400 --> 00:32:01,000
...совместная работа не должна вестись только людьми.
761
00:32:01,000 --> 00:32:02,234
В неё также могут быть вовлечены роботы,
762
00:32:02,234 --> 00:32:03,334
как Дэн уже говорил вам при обсуждении API,
763
00:32:03,334 --> 00:32:05,234
и я тоже расскажу.
764
00:32:05,234 --> 00:32:06,367
И это - в реальном времени, ок?
765
00:32:06,367 --> 00:32:08,501
Так что вы можете делать это с теми же данными
766
00:32:08,501 --> 00:32:09,634
в одно и то же время.
767
00:32:09,634 --> 00:32:10,868
И наконец,
768
00:32:10,868 --> 00:32:12,200
так как Волны и роботы
769
00:32:12,200 --> 00:32:13,634
размещаются в облаке вычислений,
770
00:32:13,634 --> 00:32:16,400
вы можете делать по-настоящему потрясающие вещи.
771
00:32:16,400 --> 00:32:19,200
Итак, орфография, если всё пойдет как надо,
772
00:32:19,200 --> 00:32:20,334
и у меня будет сеть
773
00:32:20,334 --> 00:32:23,834
то, я покажу вам коротенькое демо.
774
00:32:23,834 --> 00:32:26,467
О, ну же....секундочку...
775
00:32:26,467 --> 00:32:28,968
Только зайду.
776
00:32:28,968 --> 00:32:33,467
А, Дэн,
я пишу по-китайски.
777
00:32:33,467 --> 00:32:36,634
[смех]
778
00:32:36,634 --> 00:32:38,200
Всё в порядке. Получилось.
779
00:32:38,200 --> 00:32:41,701
...евро нет.
780
00:32:41,701 --> 00:32:43,534
Не знаю, почему.
781
00:32:43,534 --> 00:32:44,901
Хорошо, вернусь через секунду.
782
00:32:44,901 --> 00:32:48,767
Итак, ага, Ларс показывал хитрые демки
783
00:32:48,767 --> 00:32:50,801
утром - с "Iceland" и тому подобным.
784
00:32:50,801 --> 00:32:53,434
Но, ага, я хочу посмотреть, могу ли я
785
00:32:53,434 --> 00:32:56,934
...увеличить размер экрана так, чтобы вы его увидели.
786
00:32:56,934 --> 00:33:01,601
И... Хорошо.
787
00:33:03,601 --> 00:33:09,334
Порядок. Может, чуть великовато.
788
00:33:09,334 --> 00:33:13,767
Меньше. Меньше.
789
00:33:13,767 --> 00:33:15,200
Типа того. Порядок.
790
00:33:15,200 --> 00:33:16,901
С учётом того, что это - не мой экран,
791
00:33:16,901 --> 00:33:18,934
выйдет замечательная демонстрация.
792
00:33:18,934 --> 00:33:21,767
...обычно я занимаюсь тем,
793
00:33:21,767 --> 00:33:26,300
что печатаю что-нибудь
794
00:33:26,300 --> 00:33:30,033
и смотрю, что происходит.
795
00:33:30,033 --> 00:33:32,367
Ага, верно. Перемотал слишком сильно вправо.
796
00:33:32,367 --> 00:33:33,701
Итак, вы можете здесь видеть
797
00:33:33,701 --> 00:33:36,467
у нас здесь... исправление орфографии.
798
00:33:36,467 --> 00:33:39,767
Jinda? Мда, тут ничего хорошего.
799
00:33:39,767 --> 00:33:44,567
...так, ага, дайте-ка взглянуть, могу ли я...
800
00:33:44,567 --> 00:33:47,100
дайте-ка взглянуть, могу ли я... получить это...
801
00:33:47,100 --> 00:33:49,534
Так-то лучше. ...хорошо.
802
00:33:49,534 --> 00:33:54,467
Ну как вы там?
803
00:33:54,467 --> 00:33:56,467
Ок. Итак, вы видите... о, черт
804
00:33:56,467 --> 00:33:58,868
...вы видели плохой пример автокоррекции
805
00:33:58,868 --> 00:34:00,667
с дублированием слова.
806
00:34:00,667 --> 00:34:01,968
Ну как вы там?
807
00:34:01,968 --> 00:34:06,634
Довольно-таки выматывает нервы
808
00:34:06,634 --> 00:34:09,968
здесь - на сцене.
809
00:34:09,968 --> 00:34:12,968
И...
810
00:34:12,968 --> 00:34:14,667
Порядок.
811
00:34:14,667 --> 00:34:16,334
Может, мне стоит вернуться к заготовленным демкам
812
00:34:16,334 --> 00:34:18,000
ну, вы поняли.
813
00:34:18,000 --> 00:34:21,200
Так, дайте мне еще одну попытку.
814
00:34:21,200 --> 00:34:27,167
Дайте мне еще одну попытку.
815
00:34:27,167 --> 00:34:28,334
Порядок.
816
00:34:28,334 --> 00:34:29,934
Итак, всё кроме той маленькой ошибки...
817
00:34:29,934 --> 00:34:31,067
исправилось верно...
818
00:34:31,067 --> 00:34:32,601
...вы можете ...вы можете увидеть тут замысел.
819
00:34:32,601 --> 00:34:34,133
Итак, то, что мы делаем с проверкой орфографии...
820
00:34:34,133 --> 00:34:36,801
срабатывает не всегда.
821
00:34:36,801 --> 00:34:39,734
При работе над орфографией
822
00:34:39,734 --> 00:34:44,067
мы пытаемся улучшить процесс
823
00:34:44,067 --> 00:34:45,400
проверки орфографии в контексте
824
00:34:45,400 --> 00:34:47,767
так, чтобы вам не приходилось останавливаться,
825
00:34:47,767 --> 00:34:49,367
и вы могли бы просто продолжать печатать.
826
00:34:49,367 --> 00:34:52,868
Целью этого нововведения, как и Волны в целом, является
827
00:34:52,868 --> 00:34:55,033
увеличение вашей производительности.
828
00:34:55,033 --> 00:34:57,701
Так же быстро, как при передаче нажатий клавиш,
829
00:34:57,701 --> 00:34:58,968
мы решили, что если вы сможете просто расслабиться
830
00:34:58,968 --> 00:35:00,634
и печатать на 5% быстрее,
831
00:35:00,634 --> 00:35:02,667
то время, затрачиваемое на печать, сократится на 5% ,
832
00:35:02,667 --> 00:35:03,934
а это на 5% увеличит время, которое вы сможете потратить,
833
00:35:03,934 --> 00:35:05,234
на занятия чем-нибудь другим.
834
00:35:05,234 --> 00:35:08,367
Мы хотим не только
835
00:35:08,367 --> 00:35:10,968
уметь распознавать орфографические ошибки более точно,
836
00:35:10,968 --> 00:35:13,334
но и автоматически исправлять их,
837
00:35:13,334 --> 00:35:15,868
когда мы достаточно уверены в этом.
838
00:35:15,868 --> 00:35:19,100
Итак, как же мы это делаем?
839
00:35:19,100 --> 00:35:20,767
...это было... точно...
840
00:35:20,767 --> 00:35:23,300
Итак, вот кусочки этой мозаики.
841
00:35:23,300 --> 00:35:25,300
Сперва надо найти способ
842
00:35:25,300 --> 00:35:27,701
взаимодействия подсказок корректора орфографии с пользователем,
843
00:35:27,701 --> 00:35:28,934
и мы это сделали.
844
00:35:28,934 --> 00:35:29,934
Вы видели выпадающий список.
845
00:35:29,934 --> 00:35:30,934
Вы видели автокоррекцию,
846
00:35:30,934 --> 00:35:32,434
которая чуть сбоила.
847
00:35:32,434 --> 00:35:34,901
Вот наглядный пример
848
00:35:34,901 --> 00:35:36,234
слова, которое помечено,
849
00:35:36,234 --> 00:35:37,367
и набор подсказок.
850
00:35:37,367 --> 00:35:38,767
И они - каждая из этих подсказок -
851
00:35:38,767 --> 00:35:40,267
подходят более или менее.
852
00:35:40,267 --> 00:35:42,467
И это примерно то,
853
00:35:42,467 --> 00:35:43,601
что вы хотите видеть в своем клиенте.
854
00:35:43,601 --> 00:35:45,567
И Дэн говорил вам, как мы можем расширить наш клиент
855
00:35:45,567 --> 00:35:46,868
при помощи редактора.
856
00:35:46,868 --> 00:35:48,534
Теперь вам надо как-то отобразить это.
857
00:35:48,534 --> 00:35:49,734
Итак, я говорил, что это всего лишь XML.
858
00:35:49,734 --> 00:35:50,868
Поэтому вы сможете отобразить всё
859
00:35:50,868 --> 00:35:52,267
точно так, как вы хотите.
860
00:35:52,267 --> 00:35:53,934
Берете spell-тэг с подсказками,
861
00:35:53,934 --> 00:35:55,133
а затем используете это как примечание
862
00:35:55,133 --> 00:35:56,334
для диапазона.
863
00:35:56,334 --> 00:35:57,934
Видите, тут есть набор подсказок.
864
00:35:57,934 --> 00:35:59,934
Это слова и их оценки,
865
00:35:59,934 --> 00:36:02,534
которые отображают степень их релевантности.
866
00:36:02,534 --> 00:36:03,934
С этим всё ясно, да?
867
00:36:03,934 --> 00:36:05,701
Знаете, тут нет ничего особенного,
868
00:36:05,701 --> 00:36:07,200
это просто отображение проблемы
869
00:36:07,200 --> 00:36:09,501
которую мы пытаемся представить в Волне.
870
00:36:09,501 --> 00:36:10,901
...а вот ещё третий кусочек.
871
00:36:10,901 --> 00:36:13,834
Здесь чуть хитрее, чем в первых двух.
872
00:36:13,834 --> 00:36:15,601
Мы собираемся сделать Спелли - робота по проверке орфографии.
873
00:36:15,601 --> 00:36:17,434
Итак, Спелли - это агент,
874
00:36:17,434 --> 00:36:19,834
такой же, какой вы можете построить в App Engine
875
00:36:19,834 --> 00:36:21,868
за исключением того, что мы построили его в датацентрах Google.
876
00:36:21,868 --> 00:36:24,033
Он - участник вашей Волны,
877
00:36:24,033 --> 00:36:26,100
который может видеть изменения
878
00:36:26,100 --> 00:36:27,767
по мере их появления в Волне,
879
00:36:27,767 --> 00:36:29,667
проверять вашу орфографию, предлагая затем свои варианты.
880
00:36:29,667 --> 00:36:31,200
Всё, что он делает - это записывает эти подсказки
881
00:36:31,200 --> 00:36:33,033
обратно в Волну.
882
00:36:33,033 --> 00:36:36,267
...итак, вот - пример.
883
00:36:36,267 --> 00:36:37,601
Я пройду его от начала до конца,
884
00:36:37,601 --> 00:36:39,200
чтобы вы увидели, что же происходит.
885
00:36:39,200 --> 00:36:41,467
Итак, вот пример с Волной.
886
00:36:41,467 --> 00:36:43,701
Я говорю "let's meet for lunch tomorrow."
887
00:36:43,701 --> 00:36:45,734
И в окошке я написал
888
00:36:45,734 --> 00:36:47,234
"Let's meet tomorrow morning,"
889
00:36:47,234 --> 00:36:48,467
с ошибкой в слове "meet".
890
00:36:48,467 --> 00:36:50,100
Я написал "M-E-T".
891
00:36:50,100 --> 00:36:51,868
И представьте, что как только я написал,
892
00:36:51,868 --> 00:36:54,067
это сразу же передалось.
893
00:36:54,067 --> 00:36:56,100
Но на самом деле,
894
00:36:56,100 --> 00:36:58,501
как Дэвид и Алекс уже рассказывали,
895
00:36:58,501 --> 00:37:01,300
мы упаковываем эти изменения в операции,
896
00:37:01,300 --> 00:37:02,367
объединяем их
897
00:37:02,367 --> 00:37:03,868
и отправляем их на сервер.
898
00:37:03,868 --> 00:37:06,234
Итак, давайте вообразим себе, что дельта, которую мы только что получили,
899
00:37:06,234 --> 00:37:07,801
это всего-навсего набор букв
900
00:37:07,801 --> 00:37:10,634
от E в слове "met" до
901
00:37:10,634 --> 00:37:11,834
до O в слове "morning", так?
902
00:37:11,834 --> 00:37:13,300
Мы упаковываем это
903
00:37:13,300 --> 00:37:14,367
и отправляем.
904
00:37:14,367 --> 00:37:15,567
Одни из ключевых моментов в Волне -
905
00:37:15,567 --> 00:37:16,767
это эффективность и масштабируемость.
906
00:37:16,767 --> 00:37:18,667
Я об этом ещё несколько раз упомяну.
907
00:37:18,667 --> 00:37:20,701
Мы не отправляем текст целиком.
908
00:37:20,701 --> 00:37:22,100
Мы не обязательно отправляем
909
00:37:22,100 --> 00:37:23,467
посимвольно.
910
00:37:23,467 --> 00:37:25,200
Мы отправляем дельты.
911
00:37:25,200 --> 00:37:26,667
Дельта отправляется обратно
912
00:37:26,667 --> 00:37:28,167
в сервис Google Wave.
913
00:37:28,167 --> 00:37:30,133
И дельта, не измененная
914
00:37:30,133 --> 00:37:33,234
или, наоборот, преобразованная, затем поступает к Спелли.
915
00:37:33,234 --> 00:37:34,334
А у Спелли уже есть
916
00:37:34,334 --> 00:37:36,534
некоторое предыдущее состояние Волны.
917
00:37:36,534 --> 00:37:38,968
И всё, что ему нужно, это применить преобразованную дельту,
918
00:37:38,968 --> 00:37:41,267
и теперь у него актуальное состояние Волны.
919
00:37:41,267 --> 00:37:42,734
Ещё раз: отправляется только дельта.
920
00:37:42,734 --> 00:37:44,234
Это не специальное соединение.
921
00:37:44,234 --> 00:37:45,534
Это то же самое соединение
922
00:37:45,534 --> 00:37:47,534
которое любой клиент может использовать
923
00:37:47,534 --> 00:37:50,200
с сервисом Google Wave.
924
00:37:50,200 --> 00:37:52,367
Итак, затем Spelly берет дельту и узнает,
925
00:37:52,367 --> 00:37:53,868
где эти изменения происходили в документе.
926
00:37:53,868 --> 00:37:55,367
И поскольку он интересуется словами,
927
00:37:55,367 --> 00:37:56,968
он начинает их помечать.
928
00:37:56,968 --> 00:37:59,567
Я подсветил желтым область, которая изменилась.
929
00:37:59,567 --> 00:38:01,634
Похожая ситуация происходит с каждым словом,
930
00:38:01,634 --> 00:38:03,167
к которому применяется проверка орфографии.
931
00:38:03,167 --> 00:38:05,334
Итак, давайте сосредоточимся на интересном слове
932
00:38:05,334 --> 00:38:06,801
"met"
933
00:38:06,801 --> 00:38:09,534
Для слова "met",
934
00:38:09,534 --> 00:38:12,701
давайте представим, что мы ничего не знаем о языке,
935
00:38:12,701 --> 00:38:14,267
и мы не знаем какие слова
936
00:38:14,267 --> 00:38:15,701
правильные, а какие с ошибками.
937
00:38:15,701 --> 00:38:17,300
Именно в такой ситуации Spelly и работает.
938
00:38:17,300 --> 00:38:19,100
У него нет единого словаря для этого.
939
00:38:19,100 --> 00:38:21,100
Не существует жестко заданной информации вообще.
940
00:38:21,100 --> 00:38:23,000
Это полностью статистическая система,
941
00:38:23,000 --> 00:38:24,634
которую мы обучили через веб.
942
00:38:24,634 --> 00:38:26,934
Итак, первая часть - модель ошибок,
943
00:38:26,934 --> 00:38:28,868
которая является контекстно независимой моделью.
944
00:38:28,868 --> 00:38:30,634
Берём любое слово...
945
00:38:30,634 --> 00:38:32,567
давайте предположим, что это слово содержит ошибку,
946
00:38:32,567 --> 00:38:35,968
и теперь давайте найдем другие слова, которые будут вероятными исправлениями
947
00:38:35,968 --> 00:38:37,067
нашего слова.
948
00:38:37,067 --> 00:38:38,334
Итак, конечно же, вероятные исправления,
949
00:38:38,334 --> 00:38:40,000
это слова, которые должны быть сравнительно близки
950
00:38:40,000 --> 00:38:41,767
по количеству изменяемых параметров слова,
951
00:38:41,767 --> 00:38:43,734
в зависимости от того, как вы определили изменяемые параметры.
952
00:38:43,734 --> 00:38:45,033
Следовательно должны быть такие варианты,
953
00:38:45,033 --> 00:38:46,400
как слово "meat" (мясо), еда, ну вы поняли,
954
00:38:46,400 --> 00:38:47,701
которое вы могли бы получить,
955
00:38:47,701 --> 00:38:49,868
если бы вы случайно пропустили букву "A", вы бы получили "met"
956
00:38:49,868 --> 00:38:52,467
И слово "meet" (встретить), которое нас интересует - "M-E-E-T".
957
00:38:52,467 --> 00:38:53,901
и "net", и "get", и "me".
958
00:38:53,901 --> 00:38:55,467
Это всё те слова,
959
00:38:55,467 --> 00:38:58,601
которые вы могли подразумевать, когда печатали "met".
960
00:38:58,601 --> 00:39:00,400
Вероятность
961
00:39:00,400 --> 00:39:01,901
этих различных вариантов опечаток и т.д., как я сказал,
962
00:39:01,901 --> 00:39:03,567
это и есть контекстно-независимая модель ошибок.
963
00:39:03,567 --> 00:39:04,901
Мы учитываем только слово "met"
964
00:39:04,901 --> 00:39:06,200
и ничего больше.
965
00:39:06,200 --> 00:39:08,868
Но мы получаем список этих подсказок и вероятность их релевантности.
966
00:39:08,868 --> 00:39:11,567
Затем, каждого из этих кандидатов
967
00:39:11,567 --> 00:39:12,934
мы рассматриваем в контексте.
968
00:39:12,934 --> 00:39:14,267
Это часть той магии,
969
00:39:14,267 --> 00:39:16,067
которую мы можем делать с Spelly.
970
00:39:16,067 --> 00:39:17,901
Итак, мы смотрим на контекст здесь.
971
00:39:17,901 --> 00:39:19,567
Возьмем по одному слову из контекста с каждой стороны,
972
00:39:19,567 --> 00:39:20,901
чтобы продемонстрировать это.
973
00:39:20,901 --> 00:39:23,801
И начнем смотреть, насколько приемлема
974
00:39:23,801 --> 00:39:25,167
каждая из этих фраз.
975
00:39:25,167 --> 00:39:27,868
Итак, "let's met tomorrow" (давай встретились завтра) звучит не очень хорошо.
976
00:39:27,868 --> 00:39:29,133
"Let's meat tomorrow." (давай мясо завтра)
977
00:39:29,133 --> 00:39:31,033
Неплохо, при условии, что вы действительно устраиваете барбекю.
978
00:39:31,033 --> 00:39:34,200
"let's meet tomorrow." (давай встретимся завтра)
Выглядит намного лучше.
979
00:39:34,200 --> 00:39:35,300
"Let's net, let's get,"
и так далее.
980
00:39:35,300 --> 00:39:36,300
Как вы можете заметить,
981
00:39:36,300 --> 00:39:38,501
комбинация модели ошибок
982
00:39:38,501 --> 00:39:39,901
и языковой модели
983
00:39:39,901 --> 00:39:42,534
дает нам достаточно информации для выяснения насколько релевантно
984
00:39:42,534 --> 00:39:44,934
каждое из слов
985
00:39:44,934 --> 00:39:47,167
по отношению к оригиналу.
986
00:39:47,167 --> 00:39:49,834
И небольшое замечание о языковой модели.
987
00:39:49,834 --> 00:39:51,367
Эти языковые модели действительно очень большие.
988
00:39:51,367 --> 00:39:53,534
Что-то подобное мы используем
989
00:39:53,534 --> 00:39:55,868
для Rosetta - сервиса машинного перевода,
990
00:39:55,868 --> 00:39:59,167
который вы видели в демо про Rosy.
991
00:39:59,167 --> 00:40:01,100
И мы буквально
992
00:40:01,100 --> 00:40:02,701
научились этому у глобальной сети, на всех данных,
993
00:40:02,701 --> 00:40:03,968
до которых у нас дотянулись руки.
994
00:40:03,968 --> 00:40:06,467
Миллиарды веб-страниц, миллиарды слов,
995
00:40:06,467 --> 00:40:08,934
преобразованные в мульти-мульти-гигабайтные модели.
996
00:40:08,934 --> 00:40:10,801
Это не то, что
997
00:40:10,801 --> 00:40:12,567
вы можете запустить на вашем десктопе
998
00:40:12,567 --> 00:40:13,834
и безусловно не то, что
999
00:40:13,834 --> 00:40:15,133
вы можете запустить на вашем мобильном телефоне.
1000
00:40:15,133 --> 00:40:16,434
Вам повезло, что для вас
1001
00:40:16,434 --> 00:40:17,667
это делает кто-то другой.
1002
00:40:17,667 --> 00:40:19,367
Как ни странно, это выглядит довольно просто
1003
00:40:19,367 --> 00:40:20,767
для пользователей,
1004
00:40:20,767 --> 00:40:22,234
потому что это просто большие общедоступные модели,
1005
00:40:22,234 --> 00:40:24,167
которые все могут использовать одновременно.
1006
00:40:24,167 --> 00:40:26,601
Итак, языковые модели.
1007
00:40:26,601 --> 00:40:27,934
Нам нужно выбрать слово.
1008
00:40:27,934 --> 00:40:30,601
Мы решили, что "meet" с двумя Е
1009
00:40:30,601 --> 00:40:32,067
правильное слово.
1010
00:40:32,067 --> 00:40:35,234
И всё что Spelly остается сделать - это послать обратно
1011
00:40:35,234 --> 00:40:38,634
на сервер новую дельту,
1012
00:40:38,634 --> 00:40:40,968
которая говорит "пометить слово "met",
1013
00:40:40,968 --> 00:40:42,667
этим куском XML,
1014
00:40:42,667 --> 00:40:44,100
который означает, что это орфографическая ошибка,
1015
00:40:44,100 --> 00:40:45,801
а вот это предлагаемые варианты, которые я получил для неё.
1016
00:40:45,801 --> 00:40:48,567
А вот это - то, насколько они релевантны.
1017
00:40:48,567 --> 00:40:51,100
Вот так. Он всего лишь отсылает данные обратно.
1018
00:40:51,100 --> 00:40:53,234
И это рассылается всем остальным клиентам
1019
00:40:53,234 --> 00:40:55,434
так же, как и любые другие изменения.
1020
00:40:55,434 --> 00:40:58,400
Таким образом проверка орфографии довольно хорошо работает
1021
00:40:58,400 --> 00:40:59,901
в Google Wave.
1022
00:40:59,901 --> 00:41:02,200
И это не случайность.
1023
00:41:02,200 --> 00:41:04,067
Как я говорил, мы стали смотреть в сторону
1024
00:41:04,067 --> 00:41:07,200
лингвистических приложений на заре Волны.
1025
00:41:07,200 --> 00:41:11,767
И вы могли подумать, что "живость"
1026
00:41:11,767 --> 00:41:14,133
Волны - это так круто,
1027
00:41:14,133 --> 00:41:15,400
когда вы можете наблюдать,
как множество людей
1028
00:41:15,400 --> 00:41:16,701
совместно редактируют документ.
1029
00:41:16,701 --> 00:41:18,567
И это очень даже полезно на практике.
1030
00:41:18,567 --> 00:41:20,701
Но, вы можете подумать,
1031
00:41:20,701 --> 00:41:22,033
что всё, на что мы пошли
1032
00:41:22,033 --> 00:41:23,200
для управления конкурентностью,
1033
00:41:23,200 --> 00:41:24,400
не было таким уж необходимым,
1034
00:41:24,400 --> 00:41:25,701
потому что как часто на самом деле
1035
00:41:25,701 --> 00:41:27,434
вам приходится стилизовать чей-то текст
1036
00:41:27,434 --> 00:41:28,534
одновременно?
1037
00:41:28,534 --> 00:41:29,968
Мы всегда хотели уметь
1038
00:41:29,968 --> 00:41:31,334
делать что-то подобное.
1039
00:41:31,334 --> 00:41:33,200
Мы всегда хотели иметь возможность проверять орфографию на стороне сервера
1040
00:41:33,200 --> 00:41:34,367
и выполнять целую кучу других полноценных,
1041
00:41:34,367 --> 00:41:36,467
умных приложений в Волне.
1042
00:41:36,467 --> 00:41:37,834
Так что мы начали это с настроением типа:
1043
00:41:37,834 --> 00:41:39,167
"Отлично, если мы хотим сделать это,
1044
00:41:39,167 --> 00:41:40,634
то нам придётся как-нибудь встроить
1045
00:41:40,634 --> 00:41:42,868
или, что ли, разрешить специальному сервису проверки орфографии
1046
00:41:42,868 --> 00:41:45,567
внедряться и вносить свои действительно ловкие изменения."
1047
00:41:45,567 --> 00:41:47,234
И вышло так, что вы получаете всё это бесплатно.
1048
00:41:47,234 --> 00:41:49,234
Если вы собираетесь делать это для проверки орфографии,
1049
00:41:49,234 --> 00:41:50,901
то такое можно сделать со всем, чем угодно, верно?
1050
00:41:50,901 --> 00:41:52,167
Или если вы собираетесь сделать это для людей,
1051
00:41:52,167 --> 00:41:53,734
то для орфографии вы сделаете уже бесплатно, верно?
1052
00:41:53,734 --> 00:41:56,000
Одна эта система поддерживает целый класс вещей,
1053
00:41:56,000 --> 00:41:58,434
которые нужны для поддержки этого класса
1054
00:41:58,434 --> 00:42:00,133
систем.
1055
00:42:00,133 --> 00:42:01,601
И снова об XML,
1056
00:42:01,601 --> 00:42:03,901
если бы мы не прошли этот непростой путь,
1057
00:42:03,901 --> 00:42:05,167
то сделать такое
1058
00:42:05,167 --> 00:42:07,434
было бы значительно сложнее.
1059
00:42:07,434 --> 00:42:10,234
Я всего лишь хотел поговорить немного
1060
00:42:10,234 --> 00:42:12,734
о том, почему это важно -
1061
00:42:12,734 --> 00:42:14,501
решить эту проблему именно так.
1062
00:42:14,501 --> 00:42:17,601
Самое главное, как я уже говорил,
1063
00:42:17,601 --> 00:42:21,000
это то, что вы можете получить проверку орфографии одинакового качества
1064
00:42:21,000 --> 00:42:23,234
с любого устройства, имеющего доступ к Google Wave.
1065
00:42:23,234 --> 00:42:24,968
Если вы получаете доступ с мобильного устройства
1066
00:42:24,968 --> 00:42:26,601
или с настольного компьютера или с ноутбука,
1067
00:42:26,601 --> 00:42:29,300
вы получаете доступ к тому же Спелли,
1068
00:42:29,300 --> 00:42:31,234
всегда и везде.
1069
00:42:31,234 --> 00:42:32,834
И это воистину - мощь,
1070
00:42:32,834 --> 00:42:34,734
потому что никак - даже если мы запакуем
1071
00:42:34,734 --> 00:42:36,767
какую-нибудь языковую модель, например,
1072
00:42:36,767 --> 00:42:38,300
в ваш Android,
1073
00:42:38,300 --> 00:42:39,801
мы не сможем сделать это для 40 языков
1074
00:42:39,801 --> 00:42:40,934
или, скажем, 100 языков,
1075
00:42:40,934 --> 00:42:42,334
но мы можем сделать это в дата-центре.
1076
00:42:42,334 --> 00:42:44,501
В этом и есть преимущество.
1077
00:42:44,501 --> 00:42:48,000
Мы можем, опять-таки, получить лучшее качество,
1078
00:42:48,000 --> 00:42:49,267
используя больше данных.
1079
00:42:49,267 --> 00:42:51,033
И по этому пути, я полагаю, статистическая
1080
00:42:51,033 --> 00:42:52,834
обработка натуральных языков и движется.
1081
00:42:52,834 --> 00:42:54,567
Мы просто говорим о том, что чем больше данных
1082
00:42:54,567 --> 00:42:56,167
вы используете - если бы Петер Норвиг (Peter Norwig) был здесь,
1083
00:42:56,167 --> 00:42:58,234
он бы обвинил меня за кражу его строк.
1084
00:42:58,234 --> 00:43:00,267
Но, чем больше данных вы используете,
1085
00:43:00,267 --> 00:43:02,667
тем проще решить эти проблемы,
1086
00:43:02,667 --> 00:43:04,467
и вы видите улучшение качества.
1087
00:43:04,467 --> 00:43:07,334
Как я говорил, мы можем открыть доступ к ресурсам,
1088
00:43:07,334 --> 00:43:09,300
поместив эти умные сервисы
1089
00:43:09,300 --> 00:43:10,601
в облако вычислений.
1090
00:43:10,601 --> 00:43:12,534
Мы можем открыть доступ к относительно дорогостоящим ресурсам
1091
00:43:12,534 --> 00:43:15,100
для множества пользователей, использующих одну систему,
1092
00:43:15,100 --> 00:43:17,934
которая позволяет это сделать в первую очередь.
1093
00:43:17,934 --> 00:43:19,934
Ещё кое-что, о чём я не сказал,
1094
00:43:19,934 --> 00:43:22,100
проводя демонстрацию Спелли,
1095
00:43:22,100 --> 00:43:24,200
вы заметили,
1096
00:43:24,200 --> 00:43:25,501
что мы
1097
00:43:25,501 --> 00:43:27,567
знаем точное место в тексте, где произошли изменения,
1098
00:43:27,567 --> 00:43:29,667
что означает, что нам не надо проверять целый документ,
1099
00:43:29,667 --> 00:43:31,000
верно?
1100
00:43:31,000 --> 00:43:32,767
Так что это - другой аспект эффективности.
1101
00:43:32,767 --> 00:43:34,801
Мы не возимся с целым документом.
1102
00:43:34,801 --> 00:43:36,434
Мы не аннотируем целые документы постоянно.
1103
00:43:36,434 --> 00:43:37,701
Верно?
1104
00:43:37,701 --> 00:43:39,367
Если вы просто взглянете на систему,
1105
00:43:39,367 --> 00:43:40,434
то подумаете, что её невозможно
1106
00:43:40,434 --> 00:43:41,601
масштабировать.
1107
00:43:41,601 --> 00:43:43,067
Нет способа сделать такое возможным
1108
00:43:43,067 --> 00:43:44,434
для миллионов документов
1109
00:43:44,434 --> 00:43:46,434
и для миллионов людей одновременно.
1110
00:43:46,434 --> 00:43:48,634
Но мы сделали не простую вещь.
1111
00:43:48,634 --> 00:43:50,367
Если вас это интересовало.
1112
00:43:50,367 --> 00:43:52,934
Ещё кое-что о роботах,
1113
00:43:52,934 --> 00:43:55,367
как способе реализации сервисов наподобие орфографической проверки,
1114
00:43:55,367 --> 00:43:56,968
это - их интерактивность.
1115
00:43:56,968 --> 00:43:59,067
Спелли может не только записывать данные в Волну,
1116
00:43:59,067 --> 00:44:01,434
он продолжает взаимодействовать с вами в Волне.
1117
00:44:01,434 --> 00:44:03,968
Так что он может видеть, что вы делаете потом.
1118
00:44:03,968 --> 00:44:06,534
Например, если он помечает слово как ошибочное,
1119
00:44:06,534 --> 00:44:09,634
а вы затем принимаете его исправление,
1120
00:44:09,634 --> 00:44:10,968
то это - положительный сигнал для Спелли
1121
00:44:10,968 --> 00:44:12,234
о том, что он всё сделал верно.
1122
00:44:12,234 --> 00:44:13,467
Поздравления.
1123
00:44:13,467 --> 00:44:15,801
Если робот автоматически исправил что-то,
1124
00:44:15,801 --> 00:44:17,567
а потом ему говорят: "На самом деле,
1125
00:44:17,567 --> 00:44:19,434
это - не то, что я имел в виду, я имел в виду нечто другое",
1126
00:44:19,434 --> 00:44:22,534
то это - действительно сильный отрицательный сигнал,
1127
00:44:22,534 --> 00:44:23,667
означающий, что робот ошибся,
1128
00:44:23,667 --> 00:44:25,200
и больше так делать не стоит .
1129
00:44:25,200 --> 00:44:26,868
Пока что это не реализовано
1130
00:44:26,868 --> 00:44:28,300
у Спелли,
1131
00:44:28,300 --> 00:44:29,701
но мы несомненно можем это реализовать.
1132
00:44:29,701 --> 00:44:31,400
И это - то, чего вы, как правило, не можете делать
1133
00:44:31,400 --> 00:44:33,434
в системах такого типа.
1134
00:44:33,434 --> 00:44:35,467
Хорошо, как я уже говорил,
1135
00:44:35,467 --> 00:44:37,200
речь - о большем, чем проверка орфографии.
1136
00:44:37,200 --> 00:44:38,868
Речь - о целом диапазоне других приложений,
1137
00:44:38,868 --> 00:44:40,801
которые вы или я можем представить.
1138
00:44:40,801 --> 00:44:43,234
И, если у вас есть опыт в этих вещах,
1139
00:44:43,234 --> 00:44:45,334
вы уже думаете о сотне вещей, которые можно сделать,
1140
00:44:45,334 --> 00:44:46,734
если вы похожи на меня.
1141
00:44:46,734 --> 00:44:49,701
Также в Волне интересно то,
1142
00:44:49,701 --> 00:44:51,033
что она предоставляет платформу
1143
00:44:51,033 --> 00:44:52,434
для совместной работы роботов.
1144
00:44:52,434 --> 00:44:53,868
Забудьте о людях на секунду.
1145
00:44:53,868 --> 00:44:56,567
Вы можете сделать робота для идентификации языка,
1146
00:44:56,567 --> 00:44:58,734
работающего совместно с роботом проверки орфографии,
1147
00:44:58,734 --> 00:45:00,334
для понимания того, какую языковую модель использовать.
1148
00:45:00,334 --> 00:45:03,067
Вы можете добавить переводчика Рози
1149
00:45:03,067 --> 00:45:04,534
так, чтобы он использовал ID языка.
1150
00:45:04,534 --> 00:45:06,200
И если имеется орфографическая ошибка,
1151
00:45:06,200 --> 00:45:07,934
то робот сможет также принимать во внимание орфографические ошибки
1152
00:45:07,934 --> 00:45:09,434
при выполнении перевода.
1153
00:45:09,434 --> 00:45:11,234
Все эти вещи могут взаимодейстовать.
1154
00:45:11,234 --> 00:45:12,501
Если можно определять имена собственные
1155
00:45:12,501 --> 00:45:15,100
в тексте,
1156
00:45:15,100 --> 00:45:16,534
то при переводе имён,
1157
00:45:16,534 --> 00:45:18,334
например, их можно будет трактовать по-особенному.
1158
00:45:18,334 --> 00:45:20,033
Можно использовать транслитерацию
1159
00:45:20,033 --> 00:45:22,501
вместо того, чтобы пытаться выполнить обычную работу.
1160
00:45:22,501 --> 00:45:24,100
И так делается, как вы знаете, в традиционных
1161
00:45:24,100 --> 00:45:25,868
системах типа мульти-агентных систем
1162
00:45:25,868 --> 00:45:27,501
путём создания специальных агентов, которые хороши
1163
00:45:27,501 --> 00:45:28,868
каждый в своей области.
1164
00:45:28,868 --> 00:45:30,467
И, напомню, всё это не должно быть написано
1165
00:45:30,467 --> 00:45:31,801
одним и тем же человеком, ок?
1166
00:45:31,801 --> 00:45:33,667
Они просто сотрудничают в одной Волне.
1167
00:45:33,667 --> 00:45:35,734
И все они могут работать вместе.
1168
00:45:35,734 --> 00:45:38,100
Самое важное в этой мысли то,
1169
00:45:38,100 --> 00:45:41,367
чего не хватает многим мульти-агентным системам,
1170
00:45:41,367 --> 00:45:43,367
это существование в системе ещё и пользователей,
1171
00:45:43,367 --> 00:45:45,267
также оперативно взаимодействующих.
1172
00:45:45,267 --> 00:45:46,868
Конечная же цель всего этого,
1173
00:45:46,868 --> 00:45:48,467
всех этих агентов,
1174
00:45:48,467 --> 00:45:50,434
роботов, в том, чтобы
1175
00:45:50,434 --> 00:45:53,067
повысить вашу эффективность и успешно выполнить вашу работу.
1176
00:45:53,067 --> 00:45:56,367
Что позволяет действительно сфокусироваться на том, что Вы делаете,
1177
00:45:56,367 --> 00:45:57,734
а это именно то, чего, я считаю, часто не хватает
1178
00:45:57,734 --> 00:45:59,300
в системах такого типа.
1179
00:45:59,300 --> 00:46:01,801
Поэтому это действительно здорово.
1180
00:46:01,801 --> 00:46:04,868
Я думаю, что эта модель
1181
00:46:04,868 --> 00:46:07,534
позволяющая детально отразить вашу структуру,
1182
00:46:07,534 --> 00:46:11,901
организовать умные сервисы,
1183
00:46:11,901 --> 00:46:13,734
в которых вы можете использовать
1184
00:46:13,734 --> 00:46:15,534
огромное количество данных для работы,
1185
00:46:15,534 --> 00:46:18,133
и которые вы сможете развернуть для многих, многих пользователей
1186
00:46:18,133 --> 00:46:20,033
и затем совместно взаимодействовать с ними,
1187
00:46:20,033 --> 00:46:21,634
по-настоящему мощна.
1188
00:46:21,634 --> 00:46:23,167
Я думаю, орфография и вещи наподобие этих,
1189
00:46:23,167 --> 00:46:25,234
это только начало.
1190
00:46:25,234 --> 00:46:27,234
Ну вот и всё.
1191
00:46:27,234 --> 00:46:32,133
[аплодисменты]
1192
00:46:32,133 --> 00:46:36,300
Итак, у нас есть 13 минут 47 секунд для ответов
1193
00:46:36,300 --> 00:46:37,734
на вопросы.
1194
00:46:37,734 --> 00:46:39,801
Пожалуйста, используйте микрофоны,
1195
00:46:39,801 --> 00:46:41,033
задавая вопросы.
1196
00:46:41,033 --> 00:46:42,801
Я хотел бы снова напомнить вам
1197
00:46:42,801 --> 00:46:47,934
сходить на www.haveasec.com/io и оставить отзывы об этой лекции.
1198
00:46:47,934 --> 00:46:49,734
Также, не стесняйстесь схватить любого из нас, после...
1199
00:46:49,734 --> 00:46:51,901
ну ладно - меня.
1200
00:46:51,901 --> 00:46:53,400
Или всех остальных.
1201
00:46:53,400 --> 00:46:54,734
Не стесняйтесь и позже схватить нас
1202
00:46:54,734 --> 00:46:58,300
и задать свои вопросы, если вы найдёте нас.
1203
00:46:58,300 --> 00:47:01,267
Из зала: Возможно ли применение этих технологий и теорий,
1204
00:47:01,267 --> 00:47:04,234
скажем, алгоритма комбинирования,
1205
00:47:04,234 --> 00:47:09,234
и этой модели естественного языка - к исходникам,
1206
00:47:09,234 --> 00:47:11,234
чтобы в некотором роде заменить SVN
1207
00:47:11,234 --> 00:47:13,901
и другое ПО - для просмотра дифов
1208
00:47:13,901 --> 00:47:15,000
более эффективно.
1209
00:47:15,000 --> 00:47:16,400
Вайтлоу: Ну хорошо, я отвечу...
1210
00:47:16,400 --> 00:47:18,200
Из зала: ну тут, как вы понимаете, вопрос в двух частях,
1211
00:47:18,200 --> 00:47:19,400
для вас обоих.
1212
00:47:19,400 --> 00:47:20,901
Вайтлоу: я отвечу по естественному языку,
1213
00:47:20,901 --> 00:47:22,467
а потом вы, ребята, можете ответить по ОТ.
1214
00:47:22,467 --> 00:47:24,534
Итак, видите ли,
1215
00:47:24,534 --> 00:47:27,033
знаете, многим людям приходила эта идея
1216
00:47:27,033 --> 00:47:28,434
использовать всё это для создания IDE
1217
00:47:28,434 --> 00:47:29,734
и мы думаем - это фантастка.
1218
00:47:29,734 --> 00:47:31,467
И, знаете, если бы у нас было много времени, которого у нас нет,
1219
00:47:31,467 --> 00:47:33,534
мы бы наверно и такое тоже сделали.
1220
00:47:33,534 --> 00:47:35,767
Этим способом можно было осуществлять
1221
00:47:35,767 --> 00:47:37,167
типа, знаете, более толковую помощь
1222
00:47:37,167 --> 00:47:38,801
в том же духе, как средства помощи в Eclipse
1223
00:47:38,801 --> 00:47:39,801
ну и всё такое.
1224
00:47:39,801 --> 00:47:40,934
Они пытаются помочь вам.
1225
00:47:40,934 --> 00:47:42,934
Но представляете, иметь, например,
1226
00:47:42,934 --> 00:47:45,734
целый датацентр вместо автоподсказок Eclipse.
1227
00:47:45,734 --> 00:47:48,267
Думаю, это было бы мощно.
1228
00:47:48,267 --> 00:47:51,868
Ма: окей, какой у вас вопрос?
1229
00:47:51,868 --> 00:47:56,434
Можно ли использовать управление согласованностью
1230
00:47:56,434 --> 00:47:58,934
для SVN - в качестве замены управлению исходниками?
1231
00:47:58,934 --> 00:48:01,601
Из зала: Немного более эффективно в отношении различий.
1232
00:48:01,601 --> 00:48:04,767
Ма: ну не знаю.
1233
00:48:04,767 --> 00:48:07,300
Потому что наши алгоритмы,
1234
00:48:07,300 --> 00:48:10,601
они никогда не сбоят...
1235
00:48:10,601 --> 00:48:14,100
[смех и апплодисменты]
1236
00:48:14,100 --> 00:48:15,734
Вайтолу: Это и есть - обратная сторона
1237
00:48:15,734 --> 00:48:17,133
Ма: да, это обратная сторона.
1238
00:48:17,133 --> 00:48:18,534
Потому что, когда вы...
1239
00:48:18,534 --> 00:48:20,067
касаетесь управления исходниками,
1240
00:48:20,067 --> 00:48:22,067
их... алгоритмы их слияния
1241
00:48:22,067 --> 00:48:24,767
разработаны таким образом, что
1242
00:48:24,767 --> 00:48:27,234
когда обнаруживаются конфликты,
1243
00:48:27,234 --> 00:48:30,167
если есть какие-нибудь конфликты,
1244
00:48:30,167 --> 00:48:34,434
у вас получается сбой слияния,
1245
00:48:34,434 --> 00:48:36,167
и вам нужно исправлять это вручную.
1246
00:48:36,167 --> 00:48:37,634
А причина в том, что
1247
00:48:37,634 --> 00:48:42,801
управление исходниками, на самом деле акцентировано
1248
00:48:42,801 --> 00:48:45,434
на действительное состояние документа.
1249
00:48:45,434 --> 00:48:47,200
Оно не акцентируется на изменениях
1250
00:48:47,200 --> 00:48:48,534
между документами.
1251
00:48:48,534 --> 00:48:50,968
и вам приходится... в исходниках...
1252
00:48:50,968 --> 00:48:54,667
В управлении исходниками, состояния документа -
1253
00:48:54,667 --> 00:48:58,067
это основные объекты, а различия между ними
1254
00:48:58,067 --> 00:48:59,200
вторичны.
1255
00:48:59,200 --> 00:49:00,634
Вы генерируете различия между
1256
00:49:00,634 --> 00:49:03,767
глядя на... состояния документа
1257
00:49:03,767 --> 00:49:05,701
до и после, таким образом вы осуществляете
1258
00:49:05,701 --> 00:49:07,467
алгоритм поиска отличий.
1259
00:49:07,467 --> 00:49:09,200
А то, что у нас тут,
1260
00:49:09,200 --> 00:49:13,501
это операции, являющиеся первичными объектами.
1261
00:49:13,501 --> 00:49:16,467
Состояния документа - лишь результат
1262
00:49:16,467 --> 00:49:18,534
применения операций.
1263
00:49:18,534 --> 00:49:22,567
И все наши алгоритмы
1264
00:49:22,567 --> 00:49:25,601
наше трансформирование и комбинирование,
1265
00:49:25,601 --> 00:49:30,234
они применяются непосредственно к операциям.
1266
00:49:30,234 --> 00:49:32,300
И поэтому невозможно, чтобы они сбоили,
1267
00:49:32,300 --> 00:49:35,901
потому что операции - это первичные объекты.
1268
00:49:35,901 --> 00:49:38,467
Э...
1269
00:49:38,467 --> 00:49:39,834
Из зала: это здорово.
1270
00:49:39,834 --> 00:49:41,601
Ма: ага [смеётся]
1271
00:49:41,601 --> 00:49:43,334
Вайтлоу: Кто-то вон оттуда.
1272
00:49:43,334 --> 00:49:47,367
Из зала: его вопрос как-бы опередил мой.
1273
00:49:47,367 --> 00:49:50,834
Но меня особенно интересовали термины
1274
00:49:50,834 --> 00:49:52,834
языков программирования, да и вообще термины любых
1275
00:49:52,834 --> 00:49:56,033
сообществ, у которых есть свой сленг.
1276
00:49:56,033 --> 00:49:57,934
Знаете, люди в компаниях общаются на
1277
00:49:57,934 --> 00:49:59,667
своем сленге,
1278
00:49:59,667 --> 00:50:02,567
или два доктора перекидываются медицинскими терминами,
1279
00:50:02,567 --> 00:50:06,000
или какие-нибудь двое перекидывается чем-нибудь ещё.
1280
00:50:06,000 --> 00:50:09,534
Как естественный язык вписывается
1281
00:50:09,534 --> 00:50:11,400
в особенные сообщества
1282
00:50:11,400 --> 00:50:15,234
с отличающимся словарным запасом ?
1283
00:50:15,234 --> 00:50:17,100
Вайтлоу: Это хороший вопрос.
1284
00:50:17,100 --> 00:50:18,868
и есть несколько вариантов.
1285
00:50:18,868 --> 00:50:20,167
Люди также обсуждают...
1286
00:50:20,167 --> 00:50:22,567
такие вещи как... региональные различия.
1287
00:50:22,567 --> 00:50:24,033
Ну, знаете, британский и американский английский,
1288
00:50:24,033 --> 00:50:25,200
и так далее.
1289
00:50:25,200 --> 00:50:28,834
Я думаю, что у нас есть один обобщённый...
1290
00:50:28,834 --> 00:50:30,267
как я говорил, мы обучаемся из веба
1291
00:50:30,267 --> 00:50:31,868
и наш словарный запас
1292
00:50:31,868 --> 00:50:33,567
всегда актуален.
1293
00:50:33,567 --> 00:50:35,234
Это значит, что,
1294
00:50:35,234 --> 00:50:37,734
мы можем довольно хорошо исправлять всякие приколы.
1295
00:50:37,734 --> 00:50:40,167
Но это не поможет нам с
1296
00:50:40,167 --> 00:50:41,667
жаргоном различных сообществ.
1297
00:50:41,667 --> 00:50:43,901
Существует пользовательская персонализация
1298
00:50:43,901 --> 00:50:45,067
о которой я говорил
1299
00:50:45,067 --> 00:50:46,901
и это одна из дорог, которая ведет к положительному результату,
1300
00:50:46,901 --> 00:50:48,968
путем создания модели под каждого пользователя.
1301
00:50:48,968 --> 00:50:51,334
Но это не так эффективно,
1302
00:50:51,334 --> 00:50:54,300
как создавать модели по домену,
1303
00:50:54,300 --> 00:50:55,601
общекорпоративную модель.
1304
00:50:55,601 --> 00:50:56,801
И я думаю, что
1305
00:50:56,801 --> 00:50:58,868
в области доменной модели
1306
00:50:58,868 --> 00:51:01,300
Google Apps,
1307
00:51:01,300 --> 00:51:03,033
в которой уже известна
1308
00:51:03,033 --> 00:51:05,100
структура организации, и так далее
1309
00:51:05,100 --> 00:51:07,801
и известен домен аккаунтов,
1310
00:51:07,801 --> 00:51:09,467
тогда это хороший способ.
1311
00:51:09,467 --> 00:51:12,300
И тогда, если вы начнёте говорить на слэнге
1312
00:51:12,300 --> 00:51:14,400
Спелли не будет помечать их
1313
00:51:14,400 --> 00:51:17,434
как ошибки для всех в компании.
1314
00:51:17,434 --> 00:51:20,200
Из зала: спасибо.
1315
00:51:20,200 --> 00:51:22,767
Из зала: и.. еще вопрос,
1316
00:51:22,767 --> 00:51:25,033
ну... типа...
1317
00:51:25,033 --> 00:51:29,167
доступна ли эта магия Операционных Преобразований
1318
00:51:29,167 --> 00:51:33,267
в форме руководств
1319
00:51:33,267 --> 00:51:34,968
или исходников
1320
00:51:34,968 --> 00:51:36,934
для людей, пытающихся...
1321
00:51:36,934 --> 00:51:39,000
Ванг: я рад, что вы задали именно этот вопрос.
1322
00:51:39,000 --> 00:51:42,400
потому что, если вы сходите на waveprotocol.org
1323
00:51:42,400 --> 00:51:44,334
Вайтлоу: Да, на waveprotocol.org
1324
00:51:44,334 --> 00:51:46,534
Ванг: waveprotocol.org, там документы
1325
00:51:46,534 --> 00:51:48,334
об ОТ доступны уже сейчас.
1326
00:51:48,334 --> 00:51:50,834
Также там есть
1327
00:51:50,834 --> 00:51:52,901
и протокол федерирования,
1328
00:51:52,901 --> 00:51:55,100
если вы заинтересованы работать с Волной.
1329
00:51:55,100 --> 00:51:56,267
А что был за второй вопрос?
1330
00:51:56,267 --> 00:51:57,534
Мне показалось у вас их два.
1331
00:51:57,534 --> 00:51:59,300
Из зала: Окей, другой вопрос в некотором роде относится
1332
00:51:59,300 --> 00:52:00,634
к исходному коду.
1333
00:52:00,634 --> 00:52:02,300
Он довольно прагматичный.
1334
00:52:02,300 --> 00:52:04,133
Если используя Волну, разослать
1335
00:52:04,133 --> 00:52:05,801
исходный код, то
1336
00:52:05,801 --> 00:52:08,968
он начнёт помечаться
1337
00:52:08,968 --> 00:52:10,300
как ошибочный.
1338
00:52:10,300 --> 00:52:12,467
Как объяснить Спелли игнорировать
1339
00:52:12,467 --> 00:52:13,901
части документа?
1340
00:52:13,901 --> 00:52:15,267
Вайтлоу: да, я упоминал
1341
00:52:15,267 --> 00:52:16,534
агента идентификации языка,
1342
00:52:16,534 --> 00:52:18,634
как часть системы, которая уже реализована,
1343
00:52:18,634 --> 00:52:20,300
и таким образом мы можем пытаться автоматически
1344
00:52:20,300 --> 00:52:21,467
определять эти отличия.
1345
00:52:21,467 --> 00:52:23,667
Но будет и переопределение вручную,
1346
00:52:23,667 --> 00:52:25,868
где можно особо пометить
1347
00:52:25,868 --> 00:52:27,667
части текста и
1348
00:52:27,667 --> 00:52:29,200
сказать: "нет, Спелли, не ходи сюда"
1349
00:52:29,200 --> 00:52:31,000
"Нет, не исправляй,
1350
00:52:31,000 --> 00:52:34,100
букву "И" на "Й" в моих папках."
1351
00:52:34,100 --> 00:52:35,501
Данилатос: можно мне к этому добавить?
1352
00:52:35,501 --> 00:52:37,767
как я упоминал раньше,
1353
00:52:37,767 --> 00:52:40,067
интерпретация таких аннотаций
1354
00:52:40,067 --> 00:52:41,601
на совести клиента.
1355
00:52:41,601 --> 00:52:44,300
Так что можно легко заставить клиента игнорировать
1356
00:52:44,300 --> 00:52:47,300
ошибки орфографии в документе
1357
00:52:47,300 --> 00:52:50,000
или в областях документа, которые вы выберете.
1358
00:52:53,734 --> 00:52:55,968
Из зала: есть ли планы обнародовать API
1359
00:52:55,968 --> 00:52:58,701
для таких вещей, как Полли, чтобы за пределами Волны
1360
00:52:58,701 --> 00:52:59,968
можно было пользоваться этими сервисами,
1361
00:52:59,968 --> 00:53:01,801
чтобы делать умную коррекцию орфографии
1362
00:53:01,801 --> 00:53:05,033
на основе ваших замечательных баз данных?
1363
00:53:05,033 --> 00:53:07,701
Вайтлоу: я бы сказал,
1364
00:53:07,701 --> 00:53:09,234
мы обожаем открывать API.
1365
00:53:09,234 --> 00:53:10,868
Мне особо нечего сказать.
1366
00:53:10,868 --> 00:53:12,334
Но, очевидно,
1367
00:53:12,334 --> 00:53:13,834
хорошая орфография - это
1368
00:53:13,834 --> 00:53:15,434
не из тех сервисов, которые нам нужны исключительно в Волне.
1369
00:53:15,434 --> 00:53:20,934
Есть множество других приложений для неё.
1370
00:53:20,934 --> 00:53:22,634
Из зала: И другая большая проблема
1371
00:53:22,634 --> 00:53:25,601
в совместной работе, и email, и идентификации,
1372
00:53:25,601 --> 00:53:27,033
да, идентификация.
1373
00:53:27,033 --> 00:53:29,434
Из того, что я слышал, всё что я видел
1374
00:53:29,434 --> 00:53:32,434
это email-подобные строки.
1375
00:53:32,434 --> 00:53:34,901
Фишинг, вероятно, наибольшая проблема
1376
00:53:34,901 --> 00:53:36,234
нынче с email .
1377
00:53:36,234 --> 00:53:39,667
У вас тут федерированная модель.
1378
00:53:39,667 --> 00:53:42,167
Можете побольше рассказать
1379
00:53:42,167 --> 00:53:45,467
о своих мыслях об аутентификации?
1380
00:53:45,467 --> 00:53:48,200
Как я узнаю, что Бил Гейтс
1381
00:53:48,200 --> 00:53:51,100
не писал на самом деле тот флейм о, ну, о чём угодно?
1382
00:53:51,100 --> 00:53:52,467
Вайтлоу: Хочешь ответить, Дэйв?
1383
00:53:52,467 --> 00:53:53,701
Ванг: да.
1384
00:53:53,701 --> 00:53:57,067
Итак, если вы сходите на Waveprotocol.org
1385
00:53:57,067 --> 00:53:58,834
там есть документ на тему
1386
00:53:58,834 --> 00:54:00,667
именно этого вопроса.
1387
00:54:00,667 --> 00:54:03,067
Когда вы объединяетесь,
1388
00:54:03,067 --> 00:54:06,667
операции, которыми обмениваются провайдеры,
1389
00:54:06,667 --> 00:54:07,801
подписываются.
1390
00:54:07,801 --> 00:54:10,634
И даже если операция передаётся
1391
00:54:10,634 --> 00:54:13,067
через провайдеров,
1392
00:54:13,067 --> 00:54:16,667
можно удостовериться, что она пришла из определённого источника.
1393
00:54:16,667 --> 00:54:20,901
И в некотором смысле
1394
00:54:20,901 --> 00:54:24,200
вы можете определить, кого вы хотите допускать
1395
00:54:24,200 --> 00:54:25,434
в вашу систему,
1396
00:54:25,434 --> 00:54:27,234
а кого не хотите допускать в систему.
1397
00:54:27,234 --> 00:54:29,300
И это полностью на вас, на провайдере,
1398
00:54:29,300 --> 00:54:31,634
предоставлять защиту, если вам хочется.
1399
00:54:31,634 --> 00:54:32,901
Вайтлоу: Мне нужно добавить это
1400
00:54:32,901 --> 00:54:34,534
в короткие сроки для Wavesandbox.com,
1401
00:54:34,534 --> 00:54:37,000
поэтому для первого релиза для разработчиков
1402
00:54:37,000 --> 00:54:39,100
будет доступен "белый список" аккаунтов.
1403
00:54:39,100 --> 00:54:42,868
Поэтому вы должны будете добавлять аккаунты явным образом.
1404
00:54:42,868 --> 00:54:44,133
Но, да,
1405
00:54:44,133 --> 00:54:46,801
советую вам прочесть справочный документ.
1406
00:54:46,801 --> 00:54:49,267
Из зала: Итак, к примеру, есть ли какой-либо регистр
1407
00:54:49,267 --> 00:54:50,767
доменных имен,
1408
00:54:50,767 --> 00:54:54,000
которые должны запрашиваться
1409
00:54:54,000 --> 00:54:56,334
федеральными провайдерами?
1410
00:54:56,334 --> 00:54:58,634
Они становятся их собственностью, или как?
1411
00:54:58,634 --> 00:55:00,567
Вайтлоу: О да, я думаю еще очень, очень рано.
1412
00:55:00,567 --> 00:55:02,267
Ванг: Я думаю это еще на очень ранней стадии.
1413
00:55:02,267 --> 00:55:04,300
Лучше всего начать со справочных документов.
1414
00:55:04,300 --> 00:55:06,634
И если будут какие-либо вопросы - пишите -
1415
00:55:06,634 --> 00:55:08,601
мы поможем с ними разобраться.
1416
00:55:08,601 --> 00:55:12,100
Вайтлоу: Пошлите нам Волну.
[Ванг смеется]
1417
00:55:12,100 --> 00:55:16,901
Из зала: Значит вы используете эти гигантские языковые модели
1418
00:55:16,901 --> 00:55:18,634
для проверки орфографии, так?
1419
00:55:18,634 --> 00:55:20,601
И я полагаю, для Английского языка
1420
00:55:20,601 --> 00:55:22,367
вы просто прорабатывали веб, и получили огромное количество данных.
1421
00:55:22,367 --> 00:55:24,100
И для Китайского вы могли получить много данных.
1422
00:55:24,100 --> 00:55:26,000
И для Корейского вероятно тоже.
1423
00:55:26,000 --> 00:55:28,701
А как решаются проблемы
1424
00:55:28,701 --> 00:55:30,968
с языками развивающихся страна 3-го мира,
1425
00:55:30,968 --> 00:55:33,167
в тех странах, где мы стараемся распространить использование
1426
00:55:33,167 --> 00:55:35,167
интернета и новых технологий?
1427
00:55:35,167 --> 00:55:37,200
Там, где вы не найдете 8 миллиардов
1428
00:55:37,200 --> 00:55:38,667
веб страниц?
1429
00:55:38,667 --> 00:55:40,234
Так ведь? Вы найдете две.
1430
00:55:40,234 --> 00:55:42,367
Вайтлоу: Это невероятно хороший вопрос.
1431
00:55:42,367 --> 00:55:43,601
И я рад, что вы его задали,
1432
00:55:43,601 --> 00:55:45,300
потому что Волна должна существовать не только для
1433
00:55:45,300 --> 00:55:46,834
стран первого мира,
1434
00:55:46,834 --> 00:55:48,868
в которых мы можем получить большое количество данных, так?
1435
00:55:48,868 --> 00:55:50,334
Хотя, если быть честным,
1436
00:55:50,334 --> 00:55:51,834
то я не думаю, что плохая проверка орфографии
1437
00:55:51,834 --> 00:55:53,367
это то, что удерживает страны 3-го мира от проникновения
1438
00:55:53,367 --> 00:55:54,434
веба.
1439
00:55:54,434 --> 00:55:57,033
Из зала: Нет, конечно.
[смех и аплодисменты]
1440
00:55:57,033 --> 00:56:00,033
Вайтлоу: Так что
1441
00:56:00,033 --> 00:56:03,367
мы используем веб
1442
00:56:03,367 --> 00:56:05,467
потому, что до сих пор не понимаем,
1443
00:56:05,467 --> 00:56:07,067
как же люди действительно общаются
1444
00:56:07,067 --> 00:56:08,367
между собой.
1445
00:56:08,367 --> 00:56:11,067
Если любые сообщества
1446
00:56:11,067 --> 00:56:13,501
начинают общаться друг с другом в Волне,
1447
00:56:13,501 --> 00:56:15,634
то мы можем учиться прямо по этим разговорам
1448
00:56:15,634 --> 00:56:17,801
нежели из всего веба в целом.
1449
00:56:17,801 --> 00:56:21,934
Я был бы рад обсудить это с Вами позднее.
1450
00:56:21,934 --> 00:56:24,400
Из зала: Предоставляете ли вы возможность интеграции
1451
00:56:24,400 --> 00:56:25,834
с другими
1452
00:56:25,834 --> 00:56:27,601
системами аккаунтов,
1453
00:56:27,601 --> 00:56:30,334
или придется запускать свой Волновой сервер,
1454
00:56:30,334 --> 00:56:34,434
для того, чтобы использовать другие аккаунты?
1455
00:56:34,434 --> 00:56:36,701
Ванг: давайте я попробую ответить...
1456
00:56:36,701 --> 00:56:38,267
Я не до конца понял вопрос,
1457
00:56:38,267 --> 00:56:39,767
но ответить попробую.
1458
00:56:39,767 --> 00:56:42,434
Вы имеете ввиду сторонние почтовые системы вроде...
1459
00:56:42,434 --> 00:56:44,501
Вайтлоу: Я могу использовать всё, что угодно у себя на сайте,
1460
00:56:44,501 --> 00:56:47,801
и я хочу, чтобы можно было использовать Волну,
1461
00:56:47,801 --> 00:56:51,067
не требуя от моих пользователей иметь Google-аккаунты.
1462
00:56:51,067 --> 00:56:52,200
Ванг: Ясно.
1463
00:56:52,200 --> 00:56:54,067
Я полагаю, есть несколько путей
1464
00:56:54,067 --> 00:56:57,300
для решения этой проблемы.
1465
00:56:57,300 --> 00:57:00,567
Правда запустить свой Волновой сервер - это проблема.
1466
00:57:00,567 --> 00:57:03,100
Я имею ввиду, что это не так-то просто.
1467
00:57:03,100 --> 00:57:06,701
Но гораздо легче было бы посмотреть в сторону роботов.
1468
00:57:06,701 --> 00:57:09,667
Если вы слушали доклад Гари ранее,
1469
00:57:09,667 --> 00:57:11,300
вы видели, что у нас есть хороший API
1470
00:57:11,300 --> 00:57:12,601
для создания роботов.
1471
00:57:12,601 --> 00:57:14,367
По-моему это сравнительно простой путь
1472
00:57:14,367 --> 00:57:17,200
для использования систем сообщений
1473
00:57:17,200 --> 00:57:18,934
такого типа.
1474
00:57:18,934 --> 00:57:21,267
Мы ответили на Ваш вопрос?
1475
00:57:21,267 --> 00:57:25,968
Из зала: значит создание робота позволит...
1476
00:57:25,968 --> 00:57:29,167
...Но вы не требуете наличия аккаунта в
1477
00:57:29,167 --> 00:57:32,200
системе для отправки сообщения?
1478
00:57:32,200 --> 00:57:33,801
Вайтлоу: да, пожалуйста.
Ванг: без проблем.
1479
00:57:33,801 --> 00:57:34,934
Хэннон: Чтобы вы не подумали, что я тут бездельничаю,
1480
00:57:34,934 --> 00:57:36,200
я выскажу свое мнение по этому вопросу.
1481
00:57:36,200 --> 00:57:37,868
Я считаю, что вопрос был про авторизацию
1482
00:57:37,868 --> 00:57:39,901
и про то, необходимо ли пользователям иметь google аккаунт.
1483
00:57:39,901 --> 00:57:41,767
На сегодняшний день, в данной предварительной версии для разработчиков
1484
00:57:41,767 --> 00:57:44,567
и, возможно, ещё некоторое время, единственно возможным способом входа будет google-аккаунт.
1485
00:57:44,567 --> 00:57:46,334
Наверняка большинство людей здесь
1486
00:57:46,334 --> 00:57:47,834
имеют google-аккаунты.
1487
00:57:47,834 --> 00:57:49,601
Вы можете использовать их для входа в Волну.
1488
00:57:49,601 --> 00:57:51,133
Позднее мы хотели бы подключить
1489
00:57:51,133 --> 00:57:52,467
что-то типа Friend Connect,
1490
00:57:52,467 --> 00:57:54,334
и дать возможность пользователям использовать различные системы аутентификации
1491
00:57:54,334 --> 00:57:55,634
для входа в Волну.
1492
00:57:55,634 --> 00:57:56,968
Мы хотели бы реализовать это,
1493
00:57:56,968 --> 00:58:00,534
но впереди еще много работы.
1494
00:58:00,534 --> 00:58:02,534
Вайтлоу: Спасибо.
Это был наш менеджер.
1495
00:58:04,400 --> 00:58:06,901
Да.
Из зала: Простой вопрос.
1496
00:58:06,901 --> 00:58:08,501
Можно ли как-нибудь
заставить Спелли
1497
00:58:08,501 --> 00:58:10,167
работать над комментариями в YouTube?
1498
00:58:10,167 --> 00:58:12,801
[смех]
1499
00:58:12,801 --> 00:58:15,767
[аплодисменты]
1500
00:58:15,767 --> 00:58:17,067
Из зала: Нет, серьёзно, вопрос
1501
00:58:17,067 --> 00:58:19,267
о простых возможностях,
1502
00:58:19,267 --> 00:58:21,200
которые присутствуют в почте,
1503
00:58:21,200 --> 00:58:25,834
такие как списки получателей, СС и BCC поля.
1504
00:58:25,834 --> 00:58:30,634
И что на счет борьбы со спамом?
1505
00:58:30,634 --> 00:58:33,534
Вайтлоу: Понятия типа CC и BCC
1506
00:58:33,534 --> 00:58:36,133
не применимы к Волновой модели.
1507
00:58:36,133 --> 00:58:37,934
Как вы знаете, у нас немного другая
1508
00:58:37,934 --> 00:58:39,868
модель участия, о которой вы могли слышать
1509
00:58:39,868 --> 00:58:41,133
в докладе Делла.
1510
00:58:41,133 --> 00:58:43,567
Итак, мы определенно поддерживаем группы.
1511
00:58:43,567 --> 00:58:45,767
И я надеюсь, что вы услышите
1512
00:58:45,767 --> 00:58:47,501
намного больше о группах в будущем.
1513
00:58:47,501 --> 00:58:48,767
Давайте поговорим о них подробнее.
1514
00:58:48,767 --> 00:58:49,868
Как вы знаете, группы у нас
1515
00:58:49,868 --> 00:58:50,934
уже реализованы.
1516
00:58:50,934 --> 00:58:52,667
Группы, это по-настоящему мощная возможность
1517
00:58:52,667 --> 00:58:54,901
для управления такими вещами, как списки рассылки и т.д.
1518
00:58:54,901 --> 00:58:56,133
Есть много групповых возможностей,
1519
00:58:56,133 --> 00:58:57,667
над которыми мы еще работаем.
1520
00:58:57,667 --> 00:58:59,501
Еще раз, это что то...
1521
00:58:59,501 --> 00:59:01,534
Я думаю вы еще услышите подробнее об этом
1522
00:59:01,534 --> 00:59:05,534
в ближайшем будущем.
1523
00:59:05,534 --> 00:59:08,501
Из зала: Итак, у вас есть только один сервер.
1524
00:59:08,501 --> 00:59:11,767
Но позже вы позволите людям с разных серверов
1525
00:59:11,767 --> 00:59:13,167
связываться друг с другом?
1526
00:59:13,167 --> 00:59:14,501
Ванг: Правильно.
1527
00:59:14,501 --> 00:59:17,067
Мы все еще работаем над этим.
1528
00:59:17,067 --> 00:59:20,801
Над интеграцией, процессами, протоколом,
1529
00:59:20,801 --> 00:59:23,133
фактически, у вас могут быть разные сервера,
1530
00:59:23,133 --> 00:59:25,434
которые используются совершенно различными организациями,
1531
00:59:25,434 --> 00:59:27,634
которые главным образом связываются друг с другом.
1532
00:59:27,634 --> 00:59:30,601
И что более важно, с этим федеративным протоколом
1533
00:59:30,601 --> 00:59:32,701
информация не сможет перетекать между организациями,
1534
00:59:32,701 --> 00:59:34,467
если вы не хотите что бы это происходило.
1535
00:59:34,467 --> 00:59:35,934
Из зала: В вашей реализации открытого исходного кода
1536
00:59:35,934 --> 00:59:37,734
в тот момент, когда вы его выпустите,
1537
00:59:37,734 --> 00:59:41,467
будет ли он работать на сервлетах Tomcat изначально или может...
1538
00:59:41,467 --> 00:59:43,033
Ванг: Да. Да.
1539
00:59:43,033 --> 00:59:47,033
мы планируем выпустить исходный код,
1540
00:59:47,033 --> 00:59:48,767
который в той или иной форме поможет всем
1541
00:59:48,767 --> 00:59:50,033
приступить к работе.
1542
00:59:50,033 --> 00:59:51,601
Из зала: На стороне сервера, так?
1543
00:59:51,601 --> 00:59:52,767
Ванг: Да, на стороне сервера.
1544
00:59:52,767 --> 00:59:54,234
Из зала: И потом я смогу запустить его на моем Tomcat,
1545
00:59:54,234 --> 00:59:57,901
и затем - у вас будет вся ваша магия.
1546
00:59:57,901 --> 01:00:00,634
Ванг: [смеется]. Это будет магия.
1547
01:00:00,634 --> 01:00:02,367
Да. Это будет выпущено в каком-то виде.
1548
01:00:02,367 --> 01:00:03,701
Мы всё еще... работа еще в процессе.
1549
01:00:03,701 --> 01:00:05,501
Мы еще не знаем в каком виде мы выпустим это,
1550
01:00:05,501 --> 01:00:07,033
но, в конце концов, мы что-то выпустим.
1551
01:00:07,033 --> 01:00:08,300
Из зала: Хорошо. Спасибо.
1552
01:00:08,300 --> 01:00:09,834
Хэннон: Извините, я прерву вас, но,
1553
01:00:09,834 --> 01:00:11,334
как я уже говорила, у нас дополнительные консультации,
1554
01:00:11,334 --> 01:00:12,434
которые еще продолжаются.
1555
01:00:12,434 --> 01:00:14,033
Консультации по Волне уже идут.
1556
01:00:14,033 --> 01:00:15,367
Если вы хотите поговорить о федерации,
1557
01:00:15,367 --> 01:00:16,868
если вы хотите поговорить о API,
1558
01:00:16,868 --> 01:00:18,701
то это за дверью и направо по коридору.
1559
01:00:18,701 --> 01:00:20,634
Здесь много людей из команды Волны.
1560
01:00:20,634 --> 01:00:22,367
И мы по-настоящему были рады пообщаться с вами.
1561
01:00:22,367 --> 01:00:24,167
Вайтлоу: Это хороший повод закруглиться.
1562
01:00:24,167 --> 01:00:26,000
К сожалению наше время подошло к концу.
Всем большое спасибо.
1563
01:00:26,000 --> 01:00:28,934
[аплодисменты]