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 [аплодисменты]