17 августа 2009 г.

GUI для Волны



В одной из статей я описывал инсталляцию волнового демо-сервера FedOne. В «комплекте» к серверу имеется и клиент, с весьма примитивным текстовым интерфейсом. Я уверен, что у многих из тех, кто тестировал FedOne, возникала мысль о написании GUI-клиента к нему.

И вот Thomas Beverley выложил исходные тексты клиента FedOne с графическим пользовательским интерфейсом. На скриншоте вы можете посмотреть, как это все выглядит под Windows XP. Запущены сервер и два клиента.
Есть кнопки для практически всех команд, которые сейчас имеются в API (заготовлена даже пустая кнопка «Test butt», видимо, на будущее). В центре вы видите модальное окно для добавления нового участника в волну. Аналогичное окно появляется при удалении участника.

Процедура установки этой версии клиента проста. Нужно скачать исходные тексты и заменить ими папку\src\org\waveprotocol\wave\examples\fedone\waveclient\console. После этого запускаете «ant clean» (спасибо D.Unkovsky за напоминание :) и затем «ant» для перекомпиляции.
Как пишет автор, можно легко изменить клиент с помощью имеющегося класса WaveConnector.java. Этот класс полностью документирован и позволяет упростить взаимодействие с Google-волной. Базируясь на нем, вы можете построить свой собственный текстовый клиент или создать ваш вариант графического интерфейса. Как пример смотрите класс ConsoleClient.java.


P.S. И напоследок — небольшой трюк (Windows only), теперь уже от меня.
Раз уж мы говорим о графическом интерфейсе, давайте сделаем более удобным управление сервером и клиентами. Сейчас приходится запускать их с помощью bat-файлов, причем окна с запущенными процессами невозможно свернуть в трей.
Но мы можем воспользоваться удобной утилиткой LNK file improver by Dmitry Koteroff (dk@dklab.ru) из комплекта Denwer. Она позволяет запускать любую программу и сворачивать ее окно в трей. Если вы заглянете в текст этой маленькой (6656 байт) софтинки каким-нибудь редактором, то увидите, что прямо в исходном тексте можно отредактировать ее параметры: стартовый каталог, строку запуска с аргументами, адрес иконки, нужно ли запускать свернутой в трей, позволять ли запуск нескольких экземпляров и делать ли доступным пункт «Terminate» в контекстном меню (по правой кнопке) этой крохотули.
Единственно, что надо соблюдать при изменении текста — делать замену знаков, а не вставку.
Я сделал себе три разновидности этого исполняемого файла (сервер и два клиента), добавил иконку от Google Wave и теперь у меня на экране не висит несколько DOS-образных окон, а есть лишь пара-тройка волновых «змеек» в трее (их видно в правом нижнем углу скриншота).

11 августа 2009 г.

Меняем меню: расширения волнового клиента


Как известно, в Google Wave можно использовать два типа расширений (extensions) - гаджеты и роботы. Напомню:

Гаджет - небольшая программка, которая выполняется на стороне клиента, принадлежит определенной волне и позволяет ее участникам взаимодействовать между собой, поскольку они все могут менять статус гаджета и одновременно видят эти изменения. Наглядный пример - гаджет голосования. Вы проголосовали "за" или "против", гаджет учел ваш голос и изменил таблицу результатов. Все участники волны, в которую внедрен данный гаджет, увидели это изменение.
Робот - исполняется на стороне сервера. Можно даже сказать "на стороне серверов", поскольку сейчас роботы размещаются "в облаках", на серверах Google AppEngine. Робот - равноправный участник волны. Так же, как люди, он имеет доступ к содержанию волны, может его изменять, добавлять или удалять участников данной волны, а также создавать новые "блипы" (реплики в обсуждении) и новые волны.

Возникает вопрос, а как добавлять роботов или гаджеты в волну? Поскольку роботы - это полноценные участники волны, то их можно добавлять точно так же, как и людей. Заносите адрес робота в свою адресную книгу, а потом оттуда по мере необходимости подключаете робота к нужной волне. Гаджет вставляется с помощью специального пункта в меню "Debug" (мы сейчас говорим о волновом клиенте, который используется в "песочнице" Google Wave Sandbox - http://wavesandbox.com/).

Однако со временем понимаешь, что этот процесс нужно сделать более гибким. Часто приходится подключать сразу несколько роботов к волне. Или нужно вставить какой-то собственный гаджет, которого нет в общедоступной библиотеке (или, как правильно, "гаджетнице"? :). Для решения этих вопросов мы имеем в данное время простой механизм расширения интерфейса волнового клиента. С его помощью мы можем добавлять дополнительные кнопки в меню редактирования блипа и в меню создания новой волны. Вот как это выглядит.

Задача 1. Вы написали (или откопали где-то код) удобный гаджет. Часто и с удовольствием вставляете его в волну. Но вам не хочется постоянно лезть в меню "Debug" и добавлять строку с адресом гаджета. Хорошо бы иметь просто кнопку, которая будет вставлять нужный гаджет по мановению вашего пальца.

Создаете "манифест", т.е. XML-файл с таким примерно текстом:
<extension location="Toolbar">
<info text="Are You In?"
description="Click to insert the Are You In? gadget."
imageUrl="http://wave-api.appspot.com/public/gadgets/areyouin/icon.png"/>
<insertGadget url="http://wave-api.appspot.com/public/gadgets/areyouin/gadget.xml"/>
</extension>

Затем создаете новую волну, идете в меню "Debug >Add Extension Installer" и там указываете адрес, где лежит ваш "манифест".

Сохраняете волну (кнопка "Done"). В ней появляется изображение элемента из "пазлов" с названием вашего гаджета, надписью "Автор неизвестен" и кнопкой "Install". Ее и нажимаем.


Все, теперь в вашем меню редактирования "блипа" появляется новая кнопка, которая вставляет ваш гаджет куда пожелаете. (Гусары, молчать! :) На моем скриншоте вы видите добавленную кнопку с сине-белым логотипом facebook'а.


Примечание: Структура "манифеста", как видим, очень проста. Location указывает место, куда будет добавлена кнопка (сейчас допустимо два варианта - Toolbar и NewWaveMenu, о котором чуть ниже). Info text - пояснение. Description - более подробное описание гаджета. ImageUrl - расположение картинки для кнопки. InsertGadget url - соответственно, местоположение xml-файла вашего гаджета. Можете попробовать с демо-гаджетом, который лежит здесь - http://wave-api-dmo.appspot.com/public/simplemap/whereareyou.xml


Задача 2. Вы продались роботам, частенько выкрикиваете во сне "Слава роботам! Смерть человекам!" и в любую волну добавляете с десяток любимых ботов. Правильно, Твитти нужна? Нужна, кто ж сообщит последние сплетни из твиттера. Рози нужна? Нужна, кто ж будет переводить их с разных языков. "Иветта, Мюзетта, Жанетта..."

Хочется иметь возможность одним нажатием добавлять нужный гарем роботов (ну, и людей заодно, конечно) к волне.


Создаем другой манифест:
<extension location="NewWaveMenu">
<info text="New Twave"
description="Creates a new Twitter wave."/>
<createNewWave>
<participant id="tweety-wave@appspot.com"></participant>
</createNewWave>
</extension>

Точно так же открываем новую волну, затем идем в меню "Debug >Add Extension Installer" и там указываем адрес, где в сети лежит этот "манифест".
Оп! И в панели рядом с кнопкой "New Wave" появляется кнопка со стрелкой вниз, которая при нажатии на нее показывает выпадающее меню с добавленными вами пунктами.

Примечание: Как видим, тут изменилась Location, а также появилась возможность создавать волну (createNewWave) и добавлять в нее участников (participant).

Пока, насколько мне известно, еще нет способа таким же образом добавлять участников в существующую волну или удалять их оттуда. Но API будет со временем расширяться и улучшаться. И если эти ожидания сбудутся, то у нас с вами появится возможность подстраивать свою рабочую среду в волнах сообразно нашим персональным вкусам и предпочтениям.
Или создавать "клоны" волнового клиента, заточенные под определенный круг задач (IM, совместное редактирование текстов, дискуссионное или игровое сообщество и т.п.).
Или под умения и привычки пользователей (хм, "1С-волна" для бухгалтерии, это наверное было бы круто, да! :).

Операционные Трансформации в Google Wave

Опубликовано здесь - http://docs.google.com/View?id=dgwv2xfq_12hkpwshcg

Операционные Трансформации в Google Wave

оригинал: Google Wave Operational Transformation


авторы: Дэвид Ванг (David Wang), Алекс Ма (Alex Mah)
перевод: HabraTranslation, Creative Commons BY

Waves (Волны) представляют собой серверные XML документы, позволяющие быстро и гладко вносить конкурентные правки.
Чтобы обеспечить такую живость, в качестве теоретической базы управления конкуренцией Wave использует Операционные Трансформации (ОТ).

Обзор

Совместное редактирование документа подразумевает возможность одновременного редактирования одного общего документа несколькими редакторами. Живое и конкурентное — обозначает возможность видеть изменения, которые вносят другие, буква за буквой.


Сейчас на рынке уже есть несколько продуктов, которые предлагают совместное редактирование документов. Некоторые из них предлагают конкурентное редактирование в реальном времени, такие как EtherPad и SubEthaEdit, но не позволяют редактировать текст с оформлением. Другие предлагают такую возможность, например GoogleDocs, но не обеспечивают живого гладкого конкурентного редактирования, так как не обходятся без проблем при совмещении правок.


Волна позиционируется как решение, которое предлагает одновременно и живое гладкое конкурентное редактирование, и поддержку документов с форматированным текстом.


В итоге Волны можно использовать для очень увлекательных бесед, где вы можете символ за символом видеть, что набирают собеседники, как-будто вы беседуете в кафе. Это очень похоже на обмен мгновенными сообщениями, только тут вы ещё и можете видеть, что набирает собеседник, в живую. Волны также позволяют прочувствовать и новый уровень продуктивности совместного редактирования документов, где не придётся волноваться о том, как бы не наступить кому-то на пятки, и при этом по-прежнему иметь всю базовую функциональность текстового процессора: жирность, курсив, маркированные списки и заголовки.


Волны — это нечто большее, чем просто документы с форматированным текстом. По сути, базовая технология Wave обеспечивает возможность внесения живых конкурентных правок в XML документы, которые могут быть использованы для представления любого структурированного контента, включая служебные данные, совместно используемые клиентскими и серверными системами.


Для достижения этой цели Волны используют систему управления конкуренцией, основанную на Операционных Трансформациях.

Введение

Операционные Трансформации (ОТ) — это теоретическая основа для управления конкуренцией, которое исследовалась в контексте группового редактирования на протяжении более чем 10 лет. Этот документ не описывает базовую теорию ОТ и предполагает, что читатель понимает ОТ. Для теоретической подготовки читателю предлагается ознакомиться с документами в разделе ссылок.

Вкратце, ОТ в Волне делают общий документ доступным на всех сайтах, и позволяют любому пользователю редактировать любую часть документа в любое время. Операции локального редактирования производятся без задержек и блокировок. Удаленные операции (в отличие от локальных) перед выполнением трансформируются. Свобода от блокировок при ОТ делает локальное время реакции нечувствительным к сетевым задержкам. Эти свойства ОТ играют большую роль в формировании Оптимистичного Пользовательского Интерфейса. Оптимистичность пользовательского интерфейса заключается в том, что действия пользователя выполняются и отображаются для пользователя мгновенно, без ожидания принятия сервером.

Отправной точкой для создания Волны была статья "High-latency, low-bandwidth windowing in the Jupiter collaboration system". Как и описанная в документе система Jupiter, Волны реализует клиентскую и серверную часть системы ОТ. Читателю весьма рекомендуется ознакомиться с этим документом.

В системе Волны существует несколько важных объектов. Волна — набор Всплесков. Всплеск — это набор документов. Документ состоит из XML документа и некоторых аннотаций. Всплеск — это то место, где происходят конкурентные изменения. Всплеск — это объект, к которому применяются Операционные Трансформации.

Этот документ подробно опишет те расширения, которые Волна внесла в общую теорию ОТ, и как именно Волновые операции поддерживают документы с форматированным текстом. А ещё важнее то, что этот документ описывает — как мы спроектировали волновые операции так, чтобы трансформировать огромное количество операций эффективно, и как они делают эффективным просмотр любой части истории вейвлета.

Расширение Волной теории Операционных Трансформаций

Клиенты ждут подтверждения от сервера, прежде чем посылать новые операции

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

Когда у вас множество клиентов подключены к серверу, у каждой пары клиент-сервер есть свое пространство состояний. Одно из следствий такого подхода в том, что серверу необходимо заботиться о пространстве состояний для каждого подключенного клиента, что может потребовать много памяти. Также это усложняет серверный алгоритм, требуя от него преобразования клиентских операций между пространствами состояний.

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

В дополнение к подтверждениям, клиент может вычислить возможный маршрут ОТ в пространстве состояний сервера. Мы называем это вычисленный серверный маршрут. Таким образом клиент может отправлять операции на сервер, которые уже находятся на маршруте ОТ сервера.

Это даёт важный плюс — серверу необходимо отслеживать единственное пространство состояний, являющееся историей операций, которые он применил. Когда сервер получает операцию клиента, ему остаётся только преобразовать её относительно истории операций, применить преобразованную операцию и затем разослать её остальным.


Одним из недостатков такого изменения получается то, что клиент будет видеть пакеты операций, произведённые другим клиентом в течение интервала времени, в среднем соответствующего одному полному циклу обмена с другими клиентами. Однако мы надеемся на то, что полученные от этого изменения преимущества окажутся стоящими этого.

Восстановление

Сверх ОТ, Волна так же имеет возможность восстанавливаться после коммуникационного сбоя или отказа сервера. Это особенно важно в среде крупных масштабируемых систем.

Контрольные Суммы

ОТ требует, что бы все клиенты и сервер были способны преобразовывать и выполнять операции одинаково. В качестве дополнительной гарантии, что результирующие XML документы будут идентичными, ОТ Волны также передаёт контрольные суммы документов XML вместе с операциями и подтверждениями. Это позволяет клиентам быстро обнаруживать ошибки и восстанавливаться после них, заменяя поврежденное содержимое свежими копиями с сервера.

Волновые Операции

Волновые операции бывают операциями над документом (для изменения XML документов), и операциями не над документом. Операции не для документов предназначены для задач типа добавления или удаления участника во Всплеске. Мы сосредоточимся здесь на операциях над документом, как наиболее важных в Волне.

Нелишне отметить, что XML документ в Волне может рассматриваться как одна операция над документом, которая может быть применена к пустому документу.

В этом разделе будет также описано, каким образом волновые операции остаются весьма эффективными даже при большом количестве преобразований.

Поддержка XML документов

Волна использует потоковый интерфейс для операций над документами. Это аналогично XMLStreamWriter или SAX-обработчику. Операция над документом состоит из упорядоченной последовательности изменений документа. Эти изменения применяются последовательно, по мере последовательного прохода по документу.

Организация операций над документом в таком стиле упрощает написание функции преобразования и функции комбинирования, рассматриваемых далее.

В Волне каждый 16-битный символ Юникода (используется в javascript, JSON, и строках в Java), начинающий или завершающий тэг XML документа называется элементом. Интервалы между элементами называются позициями. Позиция 0 располагается перед первым элементом. Операция над документом может содержать изменения, связанные с позициями. Например: изменение "Skip" определяет сколько позиций пропустить вперед в XML документе перед применением следующего изменения.

Волновые операции над документом также поддерживают аннотации. Аннотация — это некоторые метаданные, связанные с диапазоном элементов, заданным начальной и конечной позициями. Это чрезвычайно полезно для описания форматирования текста или предложений при синтаксической проверке, так как совсем не требует усложнения базового формата XML документа.

Волновые операции над документом состоят из следующих компонентов изменений:
пропуск (skip)
вставка символов (insert characters)
вставка начала элемента XML (insert element start)
вставка конца элемента XML (insert element end)
вставка начала анти-элемента XML (insert anti-element start)
вставка конца анти-элемента XML (insert anti-element end)
удаление символов (delete characters)
удаление начала элемента XML (delete element start)
удаление конца элемента XML (delete element end)
удаление начала анти-элемента XML (delete anti-element start)
удаление конца анти-элемента XML (delete anti-element end)
установка атрибутов XML (set attributes)
изменение атрибутов XML (update attributes)
открытие аннотации (commence annotation)
завершение аннотации (conclude annotation)


Вот более полный пример операции над документом:
skip 3
insert element start with tag "p" and no attributes
insert characters "Превед Медвед!"
insert element end
skip 5
delete characters 4

Из него можно увидеть, как именно XML документ может быть целиком представлен одной операцей.

Функция Преобразования

Представление операций над документом с использованием интерфейса потока (stream) имеет тот плюс, что делает простой их последовательную обработку.


Преобразователь операций работает, беря два потока изменений из операций на входе, одновременно их обрабатывая, и выдавая в потоки двух операций на выходе. Такая потоковая обработка гарантирует, что преобразование пары даже очень больших операций будет всё равно эффективным.

Комбинирование и Преобразование большого числа операций

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

Кроме того, алгоритм комбинирования работает с операциями как с линейными потоками, обеспечивая свою эффективность.


Операция комбинирования спроектирована так, чтобы удовлетворять следующим требованям.

Во-первых, комбинация B⋅A имеет такое свойство, что (B⋅A)(d)=B(A(d)) для всех документов, к которым может быть применена A. Это требование вытекает из определения комбинации.

Второе требование такое, что при таких A,B,X,A',B',X' и X'', что
transform(A,X) = (A',X') и transform(B,X') = (B',X'')
должно быть верным, что
transform(B⋅A,X) = (B'⋅A',X'')
и при таких A,B,X,A',B',X' и X'', что
transform(X,A) = (X',A') и transform(X',B) = (X'',B')
должно быть верным, что
transform(X,B⋅A) = (X'',B'⋅A')

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

Если n — это число операций клиента, не подтвержденных сервером, а m — число операций сервера, не подтвержденных клиентом, то для разрешения проблем конкуренции в традиционных реализациях потребуется n*m преобразований.

Преобразование множества клиентских операций на множестве серверных операций может быть эффективно, если эффективны и комбинирование, и преобразование возникших в результате этого комбинирования операций.

Мы можем сделать комбинирование достаточно эффективным, чтобы сократить время выполнения преобразования до O(n log n + m log m), где n — общее количество операций клиента, а m — общее количество операций сервера.

Ссылки

"Operational transformation". в Википедии, свободной энциклопедии, 28 мая, 2009.

David A. Nichols, Pavel Curtis, Michael Dixon, and John Lamping:
High-latency, low-bandwidth windowing in the Jupiter collaboration system, UIST '95:
Протоколы 8-го ежегодного симпозиума ACM по Пользовательскому интерфейсу и программным технологиям, стр.111-120. ACM, 1995.

9 августа 2009 г.

Три видеопрезентации на русском языке

Группа Habratranslation не прекращает своих стараний по переводу видеопрезентаций с Google I/O 2009. Теперь мы можем смотреть еще три видео с русскими субтитрами.

Первая презентация - "Google Wave: Under Hood" (Google Wave: под капотом). В ней инженеры Google рассказывают о технологиях, лежащих в основе Google Wave.


Вторая "Совместное одновременное редактирование" и третья "Обработка естественных языков" более подробно рассказывают об этих базовых технологиях Волны по отдельности.

В принципе, материал этих видео во многом повторяет "Google Wave: под капотом", но есть интересные подробности. Если вас интересует конкретная технология, смотрите более короткие вторую или третью презентации. Если общий обзор - первую.

Google Wave: Live collaborative editing ("Совместное одновременное редактирование")

Google Wave: Natural Language Processing ("Обработка естественных языков")

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




8 августа 2009 г.

Первые впечатления о Google Wave Sandbox

C разрешения автора перепечатываю материал из блога Yenyay о его первых впечатлениях от Google Wave Sandbox.

Надеюсь, это немного утолит интерес и любопытство тех, кто еще не получил приглашение в "песочницу".

Автор - Yenyay

Google Wave

google-wave

В конце мая Google представил свою новую штуку, которая по их собственным обещаниям должна перевернуть интернет. Штуку эту они назвали Google Wave. Но по презентациям было непонятно что это такое и как это что-то можно применить в народном хозяйстве. Доступ к телу Волне был только у особо приближенных к гуглу, но разработчики пообещали, что скоро начнут рассылать приглашения. Тогда же я оставил заявку, что тоже хочу пощупать Wave и как разработчик, и как простой пользователь. И вот на днях на почту пришло приглашение, причем как разработчику (как пользователю приглашения еще не рассылают).

Дальше будет большое описание возможностей Google Wave, в котором я рассказать о возможностях Волны так, чтобы стало понятно что же это за штуковина тем, кто пока не имеет доступа к ней.

Первые впечатления

В приглашении, которое я получил, говорилось, что мне заведено целых два аккаунта, названия которых напоминают почту. Основной - Jenyay@wavesandbox.com и аккаунт для тестирования роботов - Jenyay-test@wavesandbox.com. При первом заходе на столь долгожданный аккаунт меня ждало небольшое разочарование, оказалось, что мой браузер Firefox 3.6 prealpha (ночная сборка), в отличие от его предка Firefox 3.0,- это недобраузер, как какой-нибудь захудалый IE 6, и он не достоин того, чтобы под ним запускалось такое великое приложение как Google Wave. Но в качестве исключения Google разрешает зайти в Волну и ему, но под мою ответственность.

Google Wave

Позже я попробовал зайти в Wave с помощью Оперы (бета 10-й версии, сборка 1600), которая даже и не значится в списке поддерживаемых браузеров, но при этом начались страшные тормоза, Опера грузила проц на все 100%, и даже если дождаться окончания такого загруза, то все-равно ничего не работало, хотя основные элементы окна появились.

При заходе в Волны с помощью Хрома все работало нормально, а сам браузер почтительно поинтересовался не разрешу ли я хранить данные у себя на компе с помощью Google Gears:

Google Wave wave 05

Интерфейс

Я немного отвлекся, рассказывая как оно работает в разных браузерах, но до сих пор не сказал что же это вообще такое - Волна. Когда я в первый раз в нее зашел, то увидел следующую картину:

Google Wave. Главное окно

Google Wave. Главное окно

Первое что подумалось: “Сколько всяких значков, и что с этим всеми делать?”. Интерфейс довольно навороченный, но напоминающий гуглопочту. Слева список папок, а под ними список контактов. Папки представляют собой, по сути, фильтры волн. При входе в аккаунт, попадаем в папку “Inbox”, куда попадают все публичные волны (где может участвовать любой желающий) и волны, в которые меня пригласили.

Во втором столбце находится список волн в выбранной папке, а в третьем - открытые волны. На предыдущем скриншоте открытых волн не было и было предложено создать новую волну.

Но прежде чем создавать новую волну, пройдемся по уже созданным и посмотрим что они из себя представляют. А представляют они собой странную смесь форумов с древовидными комментариями, чата, в котором видно набираемый текст еще до того как он был окончательно отправлен пользователем, и Вики, которую могут одновременно редактировать все участники. Причем участники могут редактировать не только исходное сообщение и свои комментарии, но и чужие комментарии, при этом отмечается кто приложил руку к той или иной записи.

Кроме обычного редактирования текста в сообщения (они называются вейвлетами) могут встраиваться различные гаджеты, например, карта Google, а в списке участников волны могут значиться роботы, которые могут делать какую-нибудь полезную работу, например, раскрашивать текст, содержащий куски кода.

Внешний вид окна при открытии волны выглядит следующим образом:

Google Wave. Главное окно с открытой волной

Google Wave. Главное окно с открытой волной

При первом же заходе в глаза бросилась волна с названием “Русские идут!”, увидев родные буквы, я, разумеется, там и начал играться. При открытии эта волна оказалась довольно большой, в ней было 49 комментариев (это вы можете увидеть на предыдущем скриншоте). Самое верхнее сообщение волны выглядит следующим образом:

Текст волны и заголовок

Текст волны и заголовок

Сверху показаны первые из участников, чтобы посмотреть остальных, нужно щелкнуть на ссылку “71 more”. Там я написал свой первый коммент (на следующем скриншоте он выделен зеленой рамкой):

Комментарий в волне

Комментарий в волне

А здесь видна древовидность комментариев:

Древовидные комментарии в волне

Древовидные комментарии в волне

Здесь тоже зеленым отмечены новые для меня сообщения, чтобы отметить все сообщения прочитанными или непрочитанными, есть специальные кнопки.

Я уже говорил, что комментарии могут редактировать все, кто имеет доступ к волне, на следующем скриншоте я дописал свое сообщение в чужой комментарий:

Одно сообщение писали несколько человек

Одно сообщение писали несколько человек

Волны можно сворачивать как обычные окна в операционках, на следующем скриншоте видно две свернутых волны над списком волн:

Свернутые волны

Свернутые волны

Можно и развернуть волну на все окно:

Волна, развернутая на все окно браузера

Волна, развернутая на все окно браузера

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

Несколько волн в одном столбце

Несколько волн в одном столбце

Если волна сильно разрастется или появится какое-то важное сообщение, то каждый вейвлет можно выделить в отдельную волну, и в ней продолжить обсуждения.

Еще из интересных особенностей интерфейса хотелось бы отметить оформление полосы прокрутки волн. За ползунком, если его тянуть мышкой, тянется какая-то полоса, напоминающая размазывающуюся соплю :)Смотрится интересно. К сожалению, при преобразовании из avi в gif произошли какие-то глюки, поэтому анимация, где это показано, немного попортилась, но ползунок там видно.

Откройте ссылку, чтобы посмотреть анимацию

Откройте ссылку, чтобы посмотреть анимацию

Создаем волну

Теперь посмотрим что мы можем сделать при создании волны. На следующем скриншоте виден редактор сообщений (вейвлетов).

Первая волна

Первая волна

Первая строка автоматически становится заголовком волны и выделяется полужирным шрифтом. В волну можно закачивать файлы прямо с компьютера. Если закачиваются картинки, то в волне они показываются в виде превьюшек, при щелчке на которые открывается полноразмерный рисунок.

Превьюшка рисунков

Превьюшка рисунков

Есть встроенная проверка орфографии (помимо такой проверки в браузерах), но работает она только изредка даже для английского языка. Также есть возможность быстро вставлять ссылки, картинки, видео или книги, найденные в гугле.

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

Все волны хранят историю изменений, что делает их еще более близкими с вики. Я не сразу понял, что кнопкаPlayback - это именно просмотр истории, а не какого-то мультимедийного содержания.

Показ изменений в волне

Показ изменений в волне

Причем при открытии волны иногда видно, что прежде чем она окончательно загрузится, она проходит все стадии изменений.

После того как будет создана простая волна, можно поиграться с разными гаджетами и роботами. Чтобы добавить гаджет в волну, предусмотрен специальный пункт меню: Debug - Extensions - Add Gadget. После этого надо или выбрать предустановленный гаджет, или указать ссылку на него. Дополнительные гаджеты можно найти, например, здесь.

Роботы добавляются как обычные пользователи, вот оно, признание искусственного интеллекта. :)

Гаджетов наделали уже приличное количество. Здесь есть и шахматы для игры вдвоем, и игра в виселицу, и вставка карты гугла. Всех все-равно не перечислить, вот несколько скриншотов:

Google Wave wave 15 177x300 Google Wave wave 23 241x300 Google Wave wave 24 238x300

Google Wave wave 29 300x221 Google Wave wave 32 300x256

Роботов тоже уже есть немало, например, робот, раскрашивающий исходники (kasyntaxy@appspot.com):

Результат работы робота для раскраски синтаксиса

Результат работы робота для раскраски синтаксиса

А вот робот, который в комментарии выводит найденные в твиттере заданные фразы:

Twitter в Google Wave

Twitter в Google Wave

С помощью робота wave-publisher@appspot.com волны можно сделать публичными, то есть доступные всем подряд, в том числе и не только с сайта Wave. Есть еще робот, который позволяет устраивать голосования в волне.

Итого

Подведем итоги того, что мы имеем. Сейчас сайт Волны еще довольно тормозной, но это какой-то отдельно выделенный сервер для отладки, потом Волна должна заработать на более жизнеспособных серверах.

Периодически волны глючат, и тогда выскакивают вот такие сообщения:

Иногда такое случается

Иногда такое случается

Зато есть формы для отладки, которые показывают содержимое вейвлетов.

Google Wave wave 12 300x116 Google Wave wave 13 300x116

Есть еще большой пункт меню для отладки, но по нему пока ничего сказать не могу, потому что программированием под Волну я пока не занимался.

Отладочное меню

Отладочное меню

Внешние ссылки работают через специальную страницу редиректа, но она иногда глючит, не перенаправляя на нужный адрес.

Для разработки гаджетов и роботов можно использовать Python, Java, JavaScript и ActionScript. Недавно прикрутили Silverlight, но об этом на странице гаджетов не упоминают. Подробностей того на чем из этого можно писать роботов, а на чем гаджеты пока не знаю, но на Python вроде бы можно писать только роботов.

Сейчас приглашения рассылают только тем, кто регистрировался как разработчик, пользователям приглашения начнут рассылать с 30 сентября.

Остается вопрос где можно будет использовать Волну. В первую очередь на ум приходят закрытые вики разработчиков для обсуждения проектов. Наверняка появятся гаджеты для совместного рисования UML. Волна же может заменить и конференции с закрытыми форумами.

Если разработчики добавят возможность закрывать для изменения посторонними чужие тексты, то может получиться неплохая альтернатива и обычным форумам. Можно будет общаться одновременно или в “прямом эфире”, или, как сейчас ждать сообщений. По крайней мере скорость получения нужной информации наверняка увеличится.

Онлайновые игры. Они уже стали появляться, насколько это оправдано не знаю, но то, что гаджеты легко вставляются в сообщения, сыграет на руку Волне.

Смогут ли волны заменить почту не знаю, но вот то что они сама по себе это что-то среднее между почтой и IM, на такие мысли наводит. Заменить полностью почту волны вряд ли смогут, а вот дополнить ее - вполне.

Волны можно будет встраивать в свой сайт, а вот как их там будут использовать зависит от ограничений, которые владельцы сайтов смогут наложить на действия пользователей. Сейчас уже есть робот, который показывает волны на стороннем сайте.

Наверное, можно придумать и другие применения, разработчики не реализовали еще все планируемые возможности, поэтому пока что-то говорить рано, но новая игрушка мне понравилась.

Капля волны: встраивание GW на примере CMS Drupal


Как вы уже знаете, наверное, одно из достоинств проекта Google Wave состоит в его открытости. И не только в смысле доступности исходных кодов и документированности протокола. Но еще и в том, что пользоваться «волнами» можно не только на wave-сервере Гугла (т.е. не только через гугловский «клиент»). Вы можете работать с волной прямо у себя на сайте!

Да, да, знаю — сейчас вы меня забросаете гнилыми ананасами с криками «нас не пускают в песочницу, а этот рассуждает об открытости!» Потерпите, ребята, все будет — сейчас, насколько знаю, рассылаются остатки из 20 тыс. инвайтов в «песочницу» для девелоперов.
А с 30 сентября будут раздавать еще и 100 тыс. аккаунтов уже в рабочую Волну wave.google.com. Как говорится, «все там будем». :)
Так, о чем это я? Ах да. О том, что все будем в Волне и Волна будет повсюду.


Попробую рассказать о возможностях встраивания «волн» Google Wave на примере CMS Drupal. Хотя на самом деле неважно, будет ли это именно эта CMS или любая другая. Неважно даже, будет ли это сайт с использованием какой-то Content Managenment System. Google предоставляет открытый API для встраивания «волн» в любые html-страницы. Пока API очень простенький, будем надеяться, что все это дело будет развиваться дальше.

И, пока не началось, честно предупреждаю, что посмотреть внедренную волну вы сможете, только если у вас есть доступ в «песочницу». Жестоко, знаю.
Но это временно, парни из Гугла уже в курсе и усиленно работают над анонимным доступом к embed wave.

Итак, что мы имеем на август 2009 года?
Для начала вот две официальные ссылки:
Руководство — code.google.com/intl/ru-RU/apis/wave/embed/guide.html
Справка — code.google.com/intl/ru-RU/apis/wave/embed/reference.html

1. Чтобы не пересказывать официальное руководство, давайте разберем встраивание на примере.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Wave Embed API Example: Simple Wave</title>
// Добавим javascript с Embed Wave API.
<script src="http://wave-api.appspot.com/public/embed.js" type="text/javascript"></script>

<script type="text/javascript">
// Функция инициализации волны, которая будет вызываться после загрузки страницы.
function initialize() {
// Создаем новый экземпляр класса WavePanel, указывая ему адрес wave-сервера.
// Пока используется адрес девелоперской "песочницы".
// Когда появятся другие wave-сервера, можно будет их указывать здесь.
// Не забудьте указать слеш в конце адреса.
var wavePanel = new WavePanel('http://wave.google.com/a/wavesandbox.com/');
// Загружаем определенную волну.
// Определяется она по ее waveID (выглядит примерно как "2Bi7arMxYM%25A").
wavePanel.loadWave('wavesandbox.com!w+waveID');
// Наконец, вставляем волну в div с идентификатором "waveframe"
wavePanel.init(document.getElementById('waveframe'));
}
</script>
</head>

<body onload="initialize()">
// В этом div'е будет размещаться iframe с вашей волной.
// Желательно задать достаточную ширину div,
// чтобы поместились аватары всех участников волны,
// поэтому обычно лучше сразу поставить width: 100%;
<div id="waveframe" style="width: 500px; height: 100%"></div>
</body>
</html>


Вот такой пример кода приведен в руководстве (я только добавил свои пояснения). Берете, просто копируете его и вставляете в ваш материал (node) на Drupal. Только поставьте вместо waveID идентификатор какой-то реальной волны. И не забудьте включить фильтр ввода «Full HTML» (это убирает в Drupal фильтрацию нежелательных html-тегов, если кто не в курсе).

Все будет работать. Волна будет показываться в iframe на вашей странице, вы сможете спокойно добавлять, удалять и редактировать «блипы» (т.е. отдельные сообщения в рамках волны). Можете еще создавать дочерние волны (wavelets, «подволны», «вейвлеты» — русская терминология еще устоялась).

2. Но на самом деле для встраивания достаточно даже вот такого кода (мы можем убрать определение DOCTYPE и тег html):

<script src="http://wave-api.appspot.com/public/embed.js" type="text/javascript"></script>
<script type="text/javascript">
function initialize() {
var wavePanel = new WavePanel('http://wave.google.com/a/wavesandbox.com/');
wavePanel.loadWave('wavesandbox.com!w+2Bi7arMxYM%25A');
wavePanel.init(document.getElementById('waveframe'));
}
</script>
<body onload="initialize()">
<div id="waveframe" style="width: 100%; height: 100%"></div>
</body>


3. Идем дальше. Как-то не хочется иметь в исходном коде страницы сразу два тега body. Поэтому переделаем наш код, добавив заодно некоторые фичи Wave Embed API: вставим кнопки и раскрасим волну.

<script src="http://wave-api.appspot.com/public/embed.js" type="text/javascript"></script>
<div id="waveframe" style="width: 100%; height: 100%"></div>
// Добавим кнопки "Подключиться к этой волне" и "Ответить"
// ("Follow this wave" и "Reply")
<form id="comment_form">
<button type="button" onclick="wavePanel.addReply()">Говорить сюда</button>
<button type="button" onclick="wavePanel.addParticipant()">Следуй за кроликом</button>
</form>

<script>
var wavePanel = new WavePanel('https://wave.google.com/a/wavesandbox.com/');
// Настроим дизайн под оформление сайта (фон, текст, шрифт, кегль/размер шрифта).
// Размер шрифта можно указывать только в pt или px.
wavePanel.setUIConfig('#446666', '#cceedd', 'verdana', '9pt');

wavePanel.loadWave('wavesandbox.com!w+i7arMxYM%A');
wavePanel.init(document.getElementById('waveframe'));
</script>


При нажатии кнопок выполняются функции wavePanel.addReply() и wavePanel.addParticipant(). Первая кнопка добавляет новый «блип» в волну, а вторая — добавляет текущего пользователя в участники данной волны. Но ведь новый «блип» можно было добавить и раньше, скажете вы. Да, но эта кнопка добавляет его как ответ на начальное сообщение волны.
И важное замечание по второй кнопке — она добавляет в участники волны не пользователя Drupal (волна о Drupal ничего не знает), а текущего пользователя Волны. Поэтому, чтобы эта функция сработала, вы должны быть залогинены в Google Wave.

Примечание: как вы заметили, в первом варианте wavePanel.init() вызывалась по событию onload. Это было нужно, чтобы до вставки волны вся страница отрендерилась, DOM построился, были вставлены все внешние скрипты и картинки. Наверное, второй вариант, где мы убрали эту проверку — не лучшее решение и в некоторых случаях может привести к каким-то последствиям.
«Но ведь пока все работает», говорил оператор Чернобыльской АЭС, щелкая выключателями.

4. Изучение Wave Embed API показывает нам, что для wavePanel.loadWave() и wavePanel.init() есть возможность вызывать callback-функции. Для чего это нужно в народном хозяйстве — пока не очень ясно. Но можно предложить, например, такой вариант — выдать при загрузке волны приветственное сообщение с использованием имени пользователя сайта.

<script src="http://wave-api.appspot.com/public/embed.js" type="text/javascript"></script>
<div id="waveframe" style="width: 100%; height: 100%"></div>
// Добавим элемент, в котором выведем какое-либо значение, например, имя пользователя Drupal-сайта.
// Или его волновой адрес, если он его указал в своем профиле при регистрации на вашем сайте. Или еще что-то.
// Все это не обязательно выводить именно здесь, можно использовать любой элемент на странице.
<span id="waveuser"><?php global $user; print $user->name;?></span>

<form id="comment_form">
<button type="button" onclick="wavePanel.addReply()">Ответить за все</button>
<button type="button" onclick="wavePanel.addParticipant()">Пройдемте, гражданин</button>
</form>
<script>
var wavePanel = new WavePanel('https://wave.google.com/a/wavesandbox.com/');
wavePanel.setUIConfig('#446666', '#cceedd', 'verdana', '9pt');
// Для примера добавим вызов функции с приветствием пользователю, в котором используем его имя. Аналогично можно добавить callback к wavePanel.init()
wavePanel.loadWave('wavesandbox.com!w+i7arMxYM%A', welcomeMsg("Welcome to World Wide Wave, "));
wavePanel.init(document.getElementById('waveframe'));

// Собственно callback функция, которая в этом примере формирует приветственное сообщение
function welcomeMsg(text) {
var item=document.getElementById("waveuser");
if(item) {
item.innerHTML=text + item.innerHTML + "!";
}
}
</script>


В итоге, при загрузке волны наш пользователь получит сообщение типа «Welcome to World Wide Wave, Neo!». Что, в общем и целом, соответствует новой реальности.

Примечание: можно было получить имя пользователя для приветственного сообщения и другими способами. Но тут лишь пример, можете сделать по своему.

5. Другое, более полезное на мой взгляд, применение callback состоит в следующем. Как я уже сказал, если сейчас встраивать волну на страницу сайта, то ее увидят только обладатели аккаунта в «песочницу». Обычные посетители будут натыкаться на «заглушку» с сообщением о необходимости залогиниться на wavesandbox.com. Чтобы не смущать простых смертных этим огорчительным неравноправием, можно воспользоваться таким трюком:

a. Делаем изначально невидимым тот div, в котором будет показываться волна.
<div id="waveframe" style="width:100%; height: 100%; visibility:hidden;"></div>

b. А при инициализации волны вызываем callback-функцию, которая делает этот див «visible».
window.wavePanel.init(document.getElementById('waveframe'), initCallback);
function initCallback() {
document.getElementById("waveframe").style.visibility="visible";
}


Таким образом, если вы не залогинены в «песочнице», вы не увидите на странице никаких следов волны.

На этой гуманной и оптимистичной ноте позвольте сегодня закончить дозволенные речи. В следующий раз мы можем поговорить о модулях для Drupal, которые должны сделать процесс встраивания более удобным и гибким.

p.s. Мы не использовали еще функцию getFrameId() из Embed API, которая позволяет получить идентификатор созданного iframe. Но я пока не понимаю, как ею можно было бы с умом распорядиться.

Еще несколько полезных ссылок в тему «Drupal и Google Wave»:
обсуждение в группе «Google Wave Россия»
обсуждение на сайте Drupal.ru
дискуссионная группа на офсайте Drupal.org

В начале статьи использована картинка с сайта dreamstime.com

Upd.: Просили скриншотов. Пока держите вот такой:
image