четверг, 3 декабря 2009 г.
Инвайты на Google Wave
Так же не смотрите, что на скриншоте всего 16 инвайтов. Поверьте! Инвайтов хватит на всех!!!
среда, 2 декабря 2009 г.
Десктопный клиент Google Wave для... Для всего!
Waver включает в себя базовый функционал:
- Список волн
- Просмотр волны
- Контакты
- Создание новой волны
И как вы могли заметить - этот клиент базируется на версии для iPhone. То есть минимализм в интерфейсе и небольшие ограничения в функционале.
Десктопный клиент Google Wave для Mac OS X
Основным клиентом для Google Wave является браузер. Однако надо признать, что стабильней и быстрей всего Google Wave работает с броузером Google Chrome.
На данный момент больше всего повезло пользователям Apple Mac OS X — для них уже написан клиент под названием Waveboard, который реализует и повторяет весь функционал браузерной версии Google Wave.
Отличительной чертой программы Waveboard является интеграция со всеми системами нотификации операционной системы Mac OS X:
- Оповещения об обновлениях, используя систему Growl
- Показ количества обновленных волн в статусном меню и на иконке расположенной в Dock
Вам больше не потребуется отдельно устанавливать в систему Google Gears, так как он уже интегрирован в саму программу Waveboard.
Подобно браузерам, программа Waveboard также поддерживает горячие клавиши.
Текущая версия программы: Waveboard 0.11
Ссылка для скачивания: http://d.getwaveboard.com/shine/download_waveboard.php
Сайт программы: http://www.getwaveboard.com
Недавно появилась коммерческая версия программы Waveboard Pro, в которую включены следующие возможности:
- Печать одной волны (на данный момент данная опция не доступна в браузерной версии Google Wave)
- Открытие непрочитанных волн непосредственно из статусного меню
- Изменение иконки в статусном меню
- Автоматический сброс уведомлений при активации окна
- Сохранение содержимого волны как Webarchive
- Возможность скрытия иконки в Dock.
Стоимость коммерческой версии Waveboard Pro состовляет 9 ЕВРО.
Для Apple iPhone тоже доступен клиент Waveboard, который можно приобрести вApp Store за $0,99. Функциональность версии 1.0 совпадает с десктопной версией. На данный момент на рассмотрение в App Store отправлена вторая версия программы, которая будет поддерживать Push нотификацию.
Спасибр пользователю cowsam
вторник, 17 ноября 2009 г.
Вкусные гаджеты для Google Wave
Mind Map Gadget
Страница Google Labs
Ссылка на гаджет XML
Позволяет пользователям волны совместно создавать, редактировать простейшую иерархию данных/идей. Позволяет добавлять иконки (например для расстановки приоритета задач), а также голосовать за каждый из пунктов. Понятный интерфейс и минимум функций.
Plany
Страница Google Code
Ссылка на гаджет XML
Неплохой по функционалу планировщик задач. Дает возможность следить за выполнением той или иной задачи, указывать ответственное лицо, сроки начала и конца выполнения, а также состояние. С помощью сервиса Google Charts строит 2 графика: сколько человеко часов выделяется для той или иной задачи и диаграмму Ганта (иллюстрация плана, графика работ по какому-либо проекту) Полезный гаджет для организации рабочего процесса.
Code Snippet
Ссылка на Волну с гаджетом
Подсветка синтаксиса. Особенности:
— Более 30 языков
— Возможность блокировки фрагмента (только для чтения) для предотвращения нежелательного редактирования другими
— Возможность совместной подсветки линий для оказания помощи в проверке кода
Napkin
Страница Google Code
Ссылка на гаджет XML
Часто что-то легче объяснить на рисунке, чем на словах. Napkin — гаджет для Google Wave, написанный в Adobe Flex, который позволяет вам очень быстро делать небольшие зарисовки в вашей волне.
Retro Chat
Страница Google Labs
Ссылка на гаджет XML
Данный гаджет позволяет вставить в волну компактный чат.
Спасибо пользователю Kuper за данную подборку
среда, 4 ноября 2009 г.
The Complete Guide to Google Wave \ Полное руководство по Google Wave
Джина Тропани (Gina Trapani) совместно с Адамом Пэшом (Adam Pash) попытались рассказать и показать в 8 главах что же из себя представляет Google Wave.
И я думаю им это удалось! Приведу небольшой и вольный перевод глав.
Глава 1 Знакомьтесь, Google Wave
Узнаем, что такое Google Wave и какие проблемы он решает.
Глава 2 Встаем на Волну
Настройка Wave аккаунта и создание своей первой волны.
Глава 3 Управление вашими Wave контактами
Поиск и добавление людей и групп по интересам в Wave.
Глава 4 Поиск и управление Волнами
Тэги, файлы, поиск и фильтрация волн.
Глава 5 Погружаемся ещё глубже в Google Wave
Украшение содержимого ваших волн с помощью карт и слайд-шоу.
Глава 6 Управление интерфейсом Google Wave
Навигация по Волнам с помощью клавиатуры и изменение вашего интерфейса.
Глава 7 Гаджеты в Wave
Добавление динамичности вашим Волнам с помощью гаджетов.
Глава 8 Роботы в Wave
Автоматическое обновление содержимого ваших Волн с ботами-роботами.
В общем читаем оригинал, а возможно кто-то уже начал переводить ....
Оригинал книги Полное руководство по Google Wave
Всё, что уже знаем о Google Wave
P.S. Я обычно в блог пишу через блоггер программу, но вышел косяк и все мои последние посты не опубликовались, поэтому сейчас опубликую сразу пачку постов =) Читаем ))
среда, 21 октября 2009 г.
Google Wave на iPhone. Краткий обзор
Пользователь shifttstas сделал отличный обзор как Google Wave выглядит на мобильных устройствах и в частности на iPhone.
Как вы знаете Google Wave поддерживает только новые браузеры, у этого есть логичное объяснение, так как wave основан на очень мощной платформе из Java script то не каждый браузер может её запустить, но сегодня Google сделала поддержку Wave на iPhone
А так же в месте с версией для iPhone они добавили наконец поддержку показа кто онлайн.
При нахождении кого либо онлайн отображается зеленая точка
И так что бы попасть набирает в iPhone известный нам всем адрес wave.google.com, нас естественно перекидывает на https версию, после того как увидим окно
Нажимаем Go Ahead
И попадаем в
Одна из самых интересных вещей, что гаджеты работают!
А так же можно посмотреть на свой контакт список
Функция прокрутки времени Playback тоже работает
А вот и меню управления волной
Ну что же можно написать? Спасибо, Стас, что ты сделал такой обзор и будем как всегда ждать, когда всех пустят в Google Wave. Самое главное, что бы это ожидание не превратилось в привычку.
Написание базового wave-робота на python'e
По лету мне достался инвайт в Google Wave Sandbox. Но в этой самой песочнице было очень много народу, все волны были публичными, и мой бедный нетбук только с большим скрипом переваривал всю эту активность, так что, немного поигравшись, на сендбокс я забил :)
И вот недавно мой аккаунт в sandbox превратился в аккаунт в лайвпревью, и я, разослав инвайты тем, до кого добрался, и ожидая, пока хоть кто-то из знакомых их получит, сел разбираться с роботским апи.
Результатом разбирательств стал такой вот базовый робот: bakarobo@appsot.com, который умеет пока всего-ничего:
по команде !br:bor! достать случайную цитату с баша
по команде !br:rb! достать фото дня с rosbest'а
по команде !br:BakaRobo! откликнуться :)
и ругаться в ответ на все незнакомые команды.
И в процессе создания я понял забавную вещь: для Wave-роботов разработана большая, клевая API … Практически не документированная на текущий момент :) По крайней мере, референс по питоновской апи — это просто генеренный перечень классов и функций, из которого не понятно практически ничего.
И вот, потратив некоторое время на чтение разных доков и семплов, я, как мне кажется, выделил некоторый базовый набор информации, необходимой для того, чтобы сделать уже какого-то полезного робота. О всех этих нужных штуках я и хочу рассказать, может быть, не слишком хорошо структурировано :)
Начнем с того, что роботов размещать следует на Google App Engine. Как создать там приложение и скачать инструментарий для коммитов кода я рассказывать не буду — там все очень понятно объяснено.
Итак, мы скачали инструменты, и в некоей папке на диске у нас возникла примерно такая картинка:
.
..
google_appengine
our_robot
Где our_robot — папка, в которой будет наш робот. И вот в эту-то папку мы и скачиваем и распаковываем вот этот архивчик с code.google.com — это, собственно, питоновская апишка.
Теперь мы готовы к собственно разработке.
На всякий случай: коммит кода в аппенджин делается так:
python ./google_appengine/appcfg.py update ./our_robot/ — потом нас спрашивают о мыле и пароле и дают залить файло.
В базовом случае главных файлов в проекте будет три:
Питоновый API xml-ку кастати сам генерирует, на базе аргументов к robot.Robot, а вот для Java API надо писать ручками.our_robot.py - собственно, код робота
app.yaml - нечто вроде манифеста
_wave/capabilities.xml - файлик, объявляющий эвенты, которые хочет слушать робот.
Так что, видимо, от некоторого количества телодвижений в процессе разработки можно отказаться.
Список эвентов можно посмотреть тут, но самые важные для робота, на мой взгляд, это:
WAVELET_SELF_ADDED — срабатывает, когда робота добавляют в волну, в этот момент неплохо показать маленькое инфо по использованию;
BLIP_SUBMITTED — срабатывает, когда создается/редактируется блип волны, причем не в момент написания текста, а когда уже жмякнута кнопка «Done».
Поехали дальше.
Манифест app.yaml выглядит, судя по туториалу на code.google.com, примерно так:
application: our_robot
version: 1
runtime: python
api_version: 1
handlers:
- url: /_wave/.*
script: our_robot.py
- url: /assets
static_dir: assets
- url: /icon.png
static_files: icon.png
upload: icon.png
Тут, вроде, все понятно. Название робота, версии, чем запускаем, версия апи и хендлеры для разных урлов.
Единственное, на что следует обратить внимание — это "-url: /icon.png" в разделе хендлеров. Этого, кажется, нету в туториале, конструкция позволяет задать способ обращения с иконкой робота. Рисуем ее в пнгшку, сохраняем в папку робота, объявляем внутри питоновского файла :)
capabilities.xml, опять же, по тутору, выглядит тоже незамысловато:
<?xml version="1.0" encoding="utf-8"?>
<w:robot xmlns:w="http://wave.google.com/extensions/robots/1.0">
<w:capabilities>
<w:capability name="WAVELET_SELF_ADDED" content="true" />
<w:capability name="BLIP_SUBMITTED" content="true" />
</w:capabilities>
<w:version>1</w:version>
</w:robot>
Собственно, в этом файле и менять-то особо нечего: только номер версии да эвенты, которые мы хотим слушать.А вот после того, как вся эта предварительная суматоха закончилась и начинается, собственно, довольно приятная возня с написанием питоновского кода робота.
Для начала я опишу общую структуру кода, как он приводится в примерах и туториале, а потом накидаю всяких минорных полезностей, которых в туториале нет, в референсе до них еще надо докопаться :), так что мне пришлось добывать их из примеров.
Итак, в общем и целом код болванки для робота выглядит примерно так:
from waveapi import events
from waveapi import model
from waveapi import robot
def OnRobotAdded(properties, context):
pass
def OnBlipSubmitted(properties, context):
pass
if __name__ == '__main__':
myRobot = robot.Robot('our_robot',
image_url='http://our_robot.appspot.com/icon.png', #иконка контакта для робота
version='2.3', #версия
profile_url='http://our_robot.appspot.com/') #адрес профиля контакта
# Назначаем события:
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipSubmitted)
# Запуск
myRobot.Run()
И как бы вроде бы все замечательно и понятно. Но когда начинаешь писать собственно функции событий, понимаешь, что совершенно неясно, как, к примеру, заменить кусок текста на другой кусок текста, не говоря уже о том, чтобы что-нибудь покрасить или подчеркнуть.В результате не слишком долгого, но довольно упорного ресерча я нарыл вот такой вот список полезных методов, которого мне хватило для написания робота:
Во-первых, чтобы в функциях обработки событий достать блип, с которым событие произошло (если, конечно, это событие произошло с блипом), используем
blip = context.GetBlipById(properties['blipId'])
Во-вторых, чтобы получить текст блипа и с ним оперировать, делаем
doc = blip.GetDocument()
contents = doc.GetText()
Соответственно, чтобы заменить некоторый кусок текста на другой, используем на полученный doc
doc.SetTextInRange(model.document.Range(НАЧАЛО, КОНЕЦ), НОВЫЙ_ТЕКСТ)
Чтобы вставить кусок текста в любое место:
doc.InsertText(НАЧАЛО, ТЕКСТ)
Чтобы добавить кусок текста в конец:
doc.AppendText(ТЕКСТ)
Чтобы вставить картинку:
В конец — doc.AppendElement(model.document.Image(АДРЕС_КАРТИНКИ, ШИРИНА, ВЫСОТА, ATTACHMENT_ID, АЛЬТ))
В определенное место — doc.InsertElement(НАЧАЛО, model.document.Image(АДРЕС_КАРТИНКИ, ШИРИНА, ВЫСОТА, ATTACHMENT_ID, АЛЬТ))
В общем, полезно посмотреть вот этот референс для того, чтобы узнать, что можно делать с документом. Для того, чтобы узнать виды элементов, которые можно создавать, смотрим референсы по waveapi.document.* — там есть и Image, и Link и даже Gadget.
Дальше. Все оформление и разные другие полезности блипа хранятся в так называемой аннотации. С ней все просто:
doc.SetAnnotation(model.document.Range(НАЧАЛО, КОНЕЦ), ТИП, ЗНАЧЕНИЕ)
Причем ТИП — это штука, которая описывает, что за аннотацию мы добавляем. Самый важный, имхо, это 'style/STYLE_PROP', где STYLE_PROP — это запись css атрибута в js виде.
Вдруг кто не знает — это трансформированная запись свойств css, используемая в js-скриптах, показать ее суть проще на примерах :) Например, color — это просто color, а вот font-size — это fontSize. В смысле, там, где в css дефис, в этой записи дефиса нет, но каждое слово кроме первого начинается с большой буквы. backgroundColor, backgroundImage, marginTop, и так далее.
Убираются они так же незамысловато, можно тупо убить все аннотации одного типа, например, про цвет шрифта, или цвет фона, вот такой функой:
doc.DeleteAnnotationsByName(ТИП)
А можно почистить от аннотаций определенного типа только некоторый диапозон текста:
doc.DeleteAnnotationsInRange(model.document.Range(НАЧАЛО, КОНЕЦ), ТИП)
Аннотации полезны еще тем, что в них можно хранить любую инфу, которая относится к этому блипу.
Чтобы аннотировать блип целиком, используем:
doc.AnnotateDocument(ТИП, ЗНАЧЕНИЕ)
Чтобы узнать, есть ли в блипе какой-то тип аннотации, вызывается
doc.HasAnnotation(ТИП)
Вот где-то такой набор, как мне кажется, уже позоляет создавать роботов, которые могут делать нечто полезное. Конечно, за рамками текста осталось, например, применение GAE системы баз данных и прочие приятные вещи, но, надеюсь, текст не будет полностью бесполезен.
Оригинал: Хабрахабр
Автор: Алексей Ничипоренко
четверг, 15 октября 2009 г.
Расширение Firefox для работы с Google Wave
Неофициальное расширение Firefox позволяющее следить за активностью в Google Wave. Может быть полезно для тех кто уже пользуется Wave и хочет получать уведомления о новых сообщениях.
Оно создано на основе Google Voice Add-on for Firefox и хоть функционала пока мало, но уже хорошо, что люди всё больше и больше разрабатывают для Google Wave.
Использование простое. Скачиваем само расширение Google Wave Add-on for Firefox (всего 9 кб) и у вас в правом нижнем углу появится иконка Wave. Там будет отображаться количество новых сообщений.
Автор обещает работоспособность только для пользователей wave.google.com
Взято с http://thatsmith.com/2009/10/google-wave-add-on-for-firefox
вторник, 13 октября 2009 г.
Клиент для Google Wave в виде Java Web Application
Итак, я написал небольшой проект на Java, который представляет собой клиент к Google Wave, который, в свою очередь, вы можете расширить необходимыми вам возможностями. Визуально выглядит он не очень презентабельно (впрочем, а-ля Windows 3.11, почему бы и нет), поскольку веб-дизайнер из меня не очень хороший, однако абсолютно за весь исходный код я отвечаю головой :). Так, например, требующиеся для отображения CSS-стили при этом выглядят максимально понятно, а XHTML-структура максимально упрощена (не в ущерб стандартам) для того, чтобы настоящий дизайнер мог развернуться и сделать действительно красиво :).
Сайт, исходные коды, и war-пакет с текущим состоянием проекта находятся по адресу http://code.google.com/p/sametimed
Сейчас у меня нет под рукой общедоступного хостинга, чтобы я мог прямо вот так запустить проект и дать поиграться с ним не отходя от хабра, однако, я могу предложить вам видео (на vimeo), демонстирующее его основные возможности, что, думаю, тоже вполне ничего, а запустить проект вы сможете сами, благо подробные инструкции есть на сайте проекта, а развёрнутые пояснения и подробное описание работы (и руководство к расширению возможностей) — внутри…
Sametimed b0.1 Work Demonstration (HD) from Ulric Wilfred on Vimeo.
Установка
Для того, чтобы запустить этот клиент, нужно, по идее, четыре вещи:
- WAR-пакет клиента, его можно взять из проекта на googlecode
- Установленный с настройками по умолчанию wave-protocol сервер текущей версии (0.2) (описание установки на английском, перевод с английского и описание установки на Windows )
- Любой Web-сервер, реализующий спецификации Java EE (тестировалось на встроенном в Eclipse Jetty)
- Браузер Firefox
Чуть более подробные инструкции как его запустить сам по себе или в виде рабочего проекта для Eclipse представлены на странице проекта. Здесь же я рассмотрю структуру кода и опишу как он действует (пока без что UML-диаграмм, извините, по мере возможности я их добавлю).
Общая концепция
Здесь под сочетанием «серверная сторона/часть» подразумевается не сервер wave-protocol, а серверная строна веб-приложения.
Поскольку в wave-protocol сейчас существует только консольный клиент, релизованный в виде jar-приложения, основной вопрос состоит в своевременной передаче информации с клиента на серверную часть и наоборот.
Посему стало необходимо ввести два понятия:
- Команда: отправляется с клиента на сервер, требует «открыть волну», «добавить участника», «отменить действие», «сказать привет» и т.п., отправляется по действию пользователя.
- Сообщение: отправляется с сервера на клиент, сообщает о том, что «кто-то пригласил в волну», «sonya ответила привет», «добавился участник», «произошла ошибка», отправляется при любом обновлении.
При этом, команду с клиента можно отправить сразу, сильно не задумываясь о нагрузке на сервер, а вот сообщения об обновлениях требуется отсылать только по факту происшествия. Однако, на клиенте находится javascript, который без сложных приспоcоблений не может осуществлять такие вещи. Здесь потребовался Reverse Ajax, вернее его реализация для Java — библиотека DWR (Direct Web Remoting), она позволяет вызывать функцию на клинете с сервера в тот момент, когда решит сервер, а не клиент. Их сайт рассказывает о всех возможностях, которые вовсе не ограничены данным применением, но для проекта, как я уже сказал, из всех возможностей я использовал только эту.
Команды и сообщения передаются в виде XML, а содержимое сообщений об обновлениях в виде JSON, засчёт чего в построении интерфейса участвует только Javascript (я использовал JQuery), а серверная сторона даже не задумывается о существовании UI.
(для серверной стороны в проекте есть интерфейс Renderer, реализация которого вызывается при необходимых обновлениях, но он предназначен как раз для случаев вроде консольного клиента)
Описание процесса, происходящего в текущей версии
При запуске клиента, вы видите страницу с полем для ввода юзернейма и единственной кнопкой. Wave-protocol сервер при этом должен быть запущен. При нажатии на кнопку введённый вами юзернейм передаётся в сервлет (
GetClientViewServlet
), который подключает вас «к волне», и возвращает всю структуру (модель) клиента в виде JSON. JQuery на клиентской стороне строит весь интерфейс вейвлета. Если вы нажмёте кнопку ещё раз, вы запросите ещё один вейвлет, при этом между собой они будут различаться по внутреннему ID (сгенерированному автоматически), указанному на синей полоске в скобках. По этому ID и сервер и клиент определяют, к какому клиенту относится команда и/или сообщение. Одновременно с этим DWR начинает ожидать вестей об обновлениях, а вы в это время можете ввести любую из доступных команд в поле консоли и нажать «send». Например, создать волну командой «
\new
», открыть её командой «\open <id>
» и что-нибудь сказать, набрав просто текст (как в скайпе). При нажатии на кнопку «send» отправляется POST-запрос к другому сервлету (CommandsReceiverServlet
), который получает сгенерированную в виде XML команду и тут же её выполняет, передавая данные серверу wave-protocol. Обновления в данный момент приходят с серверной стороны (и от сервера wave-protocol) в виде XML-сообщения (на клиентской стороне есть обработчик, который вызывается при получении новых сообщений), в котором содержится алиас изменившейся модели (например, «chat», «inbox», «userslist», «errors» или «editor») и её содержимое в виде JSON, которое тут же обрабатывается и обновляет соответствующую часть вейвлета.
Как видите, всё до невозможности просто.
Структура проекта и возможности для расширения
Java:
- name.shamansir.sametimed.wave Все классы, лежащие «снаружи» и относящиеся к клиенту непосредственно; здесь находятся абстрактные классы
AUpdatingWavelet
иADocumentsWavelet
— определяющие структуру соответствующего типа вейвлетов (обновляющийся вейвлет и его расширение, вейвлет содержащий документы). КлассSimpleWavelet
служит примером такой реализации. КлассWavesClient
занимается обработкой команд и именно он возвращает модель содержащегося в нём вейвлета вGetClientViewServlet
. - name.shamansir.sametimed.wave.messaging Все, что относится к командам и сообщениям. Идентификаторы команд/сообщений в
CommandID
/MessageTypeID
, сами классыCommand
иUpdateMessage
, сервлет-обработчикCommandsReceiverServlet
. - name.shamansir.sametimed.wave.model Классы, описывающие модель вейвлета. Они содержат описание каждой суб-модели, вроде списка участников, чата или текстового документа. И
ModelID
, описывающий возможные модели с абстрактным классомAModel
, конечно. Плюс,ModelFactory
, фабрика моделей. - name.shamansir.sametimed.wave.model.base Значения моделей, вроде «набора строк чата», «набора блоков текста в документе», «списка доступных волн» и т.д. Именно в этих классах описывается преобразование в JSON.
- name.shamansir.sametimed.wave.model.base.atom То, из чего состоят значения, если это необходимо для их структуры — «строка чата», «блок текста», «идентификатор волны»
- name.shamansir.sametimed.wave.model.base.chat Вейвлет с функцией чата и клиент для него
- name.shamansir.sametimed.wave.model.base.editor Вейвлет с поддержкой редактируемого документа, на данный момент не имплементирован, поэтому отключен
- name.shamansir.sametimed.wave.render Классы, относящиеся к рендерингу Здесь находится тот самый класс
JSUpdatesListener
, который средствами DWR вызывает функцию обновления на клиенте.
Самый логичный способ расширения — имплементация класса
ADocumentsWavelet
или расширение класса WaveletWithChat
. Поскольку, в наиболее вероятном случае, вы будете оперировать понятием «документ» (А чат или что-либо другое, как раз являются документами), то именно такой способ должен подойти вам лучше всего. Также вам понадобится задуматься о модели данного документа (создав соответсвующий тип, реализующий AModel
, добавить id модели в тип ModelID
и генерацию модели в ModelFactory
). Если документ не будет обрабатывать какие-либо новые команды, то этого достаточно — можно заменить в
GetClientViewServlet
возвращаемый вейвлет на ваш собственный и вуаля!.. Ах, да, ещё генерация UI на клиенте, но об этом ниже. Если же необходимы свои собственные, предназначенные сугубо для него команды, то необходимо добавить соответствующие команды в тип
CommandID
. После этого нужно расширить класс WavesClient
для поддержки вашего вейвлета и для того, чтобы он обрабатывал и передавал новые команды вейвлету независимо от предка. И, в этом случае, заменить в GetClientViewServlet
реализацию WavesClient
на вашу собственную. И снова вуаля! (снова, не учитывая UI) Вам понадобится, конечно же, учесть пару тонкостей при написании обработки команд, но в общих чертах это весь необходимый процесс для расширения функциональности клиента.
Javascript
- ui.js занимается генерацией интерфейса, для каждого блока модели есть собственный метод
- command.js отправляет и генерирует команды, принимает сообщения об обновлениях, а также содержит обработчики для кнопок
- ajax.js скрипт, который давно пора заменить на соответствующий метод jquery, но никак не доходят руки :). используется в command.js
Для того, чтобы добавить генерацию вашей модели, достаточно добавить строку, вызывающую ваш метод обработки в методы
CreateClient
и renderUpdate
объекта ClientRenderer
в ui.js
и собственно написать этот метод. Всё остальное будет (должно) работать самостоятельно. CSS
- sametimed-plain.css ещё чуть более ужасный интерфейс чем цветной :)
- sametimed-colored.css цветной, Windows 3.11-подобный интерфейс :).
Пока что стили, определяющие позиционирование и внешний вид (цветность) не разделены, хотя они разделяются комментариями в самих файлах. Думаю, я не буду этого менять.
Эпилог
Вышло много текста про один небольшой аппликейшн, но зато пост описывает все его возможности. Надеюсь найдётся не один человек, которому эта разработка будет интересна и если найдётся, планирую усовершенствовать его дальше. Пока это небольшая поделка «из интереса», но немного стараний — и её можно превратить в полноценный проект.
Тех, кто это будет тестировать, прошу постить баги в соответствующее место, в разумных пределах и не относящиеся к дизайну :).
Участие в разработке приветствуется но поощрить нечем, только лицензией :).
Взято: http://habrahabr.ru/blogs/google/72235/ by zokotuhaFly
Раздача инвайтов?
Сегодня целый день в твиттере стоит шум! И шум этот связан с раздачей инвайтов в Google Wave.
Я тоже обратил внимание и что могу вам сказать – ИМХО это фейк. Во-первых смутил домен http://www.google.com-wave.info/ Google никогда бы не зарегистрировали такой домен. Во-вторых сам сайт – просто одна страничка, на которой нам предлогают ввести свой твиттер аккаунт и электронную почту.
Думаю, что это не просто фейк, а именно сайт, созданный для сбора адресов и тветтеров, что бы потом их спамить.
Будьте внимательны к сайтам такого рода!
Для подтверждения информации всегда обращайтесь к оффициальным источникам.
А инвайт на Google Wave скоро получат многие из вас! Не будем торопить события.
вторник, 6 октября 2009 г.
Google Wave на Android
Решил показать, как же выглядят волны на устройстве Android.
Во-первых мы видим, что отображается корректно и понятно.
После того, как мы перешли на сайт, то видим список волн.
Контакты в принципе тоже не отличются от PC\Mac версии
Внутри самой волны.
Навигация по волне.
Так как это тестировал не я, то немного не понятно – а где же у нас список папок, сохранёные поиски?
Так же минус – нет индикторов колличества новых сообщений. Когда мы внутри волны, мы ведь не можем скакать то к списку волн, то внутрь волны. Ноя думаю всё это подправят. Плюс к тому же ходят слухи, что начали разработку специализированного клиента под Android устройства.
Осталось совсем немного и он выйдет в свет… Эх-эх-эх….
вторник, 15 сентября 2009 г.
Я - Волна, новая Волна!
Вадим Барсуков собрал в группе Google Wave Russia ссылки на самые лучшие русские волны.
Рядом с названием волны указан ее адрес в Google Wave Sandbox.
Чтобы найти волну, когда находитесь в "песочнице", наберите в поисковой строке id:"адресволны".
- Новые русские идут!
Общая волна
wavesandbox.com!w+fbqXcbNa%K - Лягушатник в песочнице
Для тех, кто впервые попал в Волну или просто хочет пофлудить
wavesandbox.com!w+fbqXcbNa%P - Дайте жалобную книгу
Сообщаем о найденных багах
wavesandbox.com!w+LqKGhnMa%A - Планов наших громадье-2
Собираете команду для реализации волнового проекта? Опишите свой проект здесь
wavesandbox.com!w+8oCRvzuI%z - Самопрезентации
Давайте познакомимся друг с другом. Напишите здесь о себе.
wavesandbox.com!w%252BqdeuVD86%2525B - Ценные предложения
Чего вам не хватает в Волне? Как сделать ее лучше?
wavesandbox.com!w+ZN5a1cdo%A - Страна советов
Собираем разные трюки и советы "как сделать"
wavesandbox.com!w+awnIHfWe%B - Готовимся к GDD 2009
Подготовка к Google Developer Day 2009 (Москва, 10 ноября)
wavesandbox.com!w+pMy8eIXS%C - Добро пожаловать в Волну
Общие сведения для тех, кто только что попал в "песочницу"
wavesandbox.com!w+d6kKCvwi%A - Справка по быстрым клавишам
Клавиатурные комбинации позволяют удобнее работать с Волной и волнами
wavesandbox.com!w+Ck-3O3DL%A - Справка по поиску
Волна имеет довольно мощный механизм поиска
wavesandbox.com!w+NOASruBZ%A - Русские идут!
Одна из старейших русскоязычных волн (сейчас на пенсии)
wavesandbox.com!w+ih3cy3uW%H
Спасибо большое автору! Развиваем Русское сообщество в Google Wave дальше!!!
суббота, 12 сентября 2009 г.
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-образных окон, а есть лишь пара-тройка волновых «змеек» в трее (их видно в правом нижнем углу скриншота).
Источник: Вадим Барсуков
пятница, 7 августа 2009 г.
PyGoWave Server — первый альтернативный Wave-сервер
В «очень раннем режиме», но все-таки заработал первый альтернативный Wave-сервер. Можно зарегистрироваться, создавать волны, добавлять в них других пользователей, совместно использовать гаджеты (причем можно создавать свои и делать их доступными другим). Хочется надеяться, в ближайшее время появятся и другие функции. У разработчиков есть блог. Вы также можете попробовать поставить такой сервер к себе — исходники открыты (Python, Django).
Внимание! Для использования входите через Google Chrome, через Firefox — работает не всё.
Рекомендую включить гаджет Simple Chat — это чат где сообщения появляются по мере набора.
Источник: HabraHabr
четверг, 6 августа 2009 г.
[Перевод] Google Wave: Под капотом
2009 - "Google Wave: Under the Hood" ("Google Wave: Под капотом").
Если вы хотели бы заняться программированием приложений для Волны, вам
важно познакомиться с принципами, на которых строится Google Wave. Эта
презентация дает некоторое представление о них.
среда, 5 августа 2009 г.
Архитектура Объединения Google Wave
Перевод на русский: sim-sim, 2009, Creative Commons Attribution 3.0 License.
Оригинал: Google Wave Federation Architecture
Волны Гугл являются новой коммуникационной платформой для совместной работы, основанной на хостируемых XML документах (называемых волнами), поддерживающей параллельные модификации и обновления с коротким временем ожидания. Эта платформа позволяет людям связываться и работать вместе новым, удобным и эффективным способом. Мы собираемся предложить эти преимущества пользователям Волн Гугл и мы также хотим поделиться ими со всеми, сделав волны открытой платформой, чтобы каждый мог внести свой вклад. Мы приветствуем тех, кто запускает серверы волн и становится провайдером волн для себя или как сервис для своих пользователей, и объединяет волны в "федерацию", то есть обмеривается волнами с другими и с Волнами Гугл. Таким образом, пользователи от других провайдеров волн могут связываться и работать вместе, используя совместные волны. Мы представляем "Протокол федерации Волн Гугл" для интеграции волн между провайдерами волн в Интернете.
Этот документ дает обзор того, как различные элементы технологии Волн Гугл — модель данных, операциональные преобразования и протокол клиент-сервер — используются вместе при запуске обслуживающего сервиса волн, и как провайдеры сервисов волн связываются между собой, используя Протокол федерации Волн Гугл со своими криптографическими средствами для защиты от фальсификации. Все эти элементы описаны более подробно в сопутствующих документах на этом сайте, и читатель может обратиться к ним за деталями. Фокусом этого документа является федерация, которая включает протокол федерации волн типа "сервер-сервер", и не касается протокола типа "клиент-сервер" между клиентами и сервером волн у провайдера волн. Тем не менее, этот документ далек от исчерпывающего доклада о федерации волн. В частности, вложения (attachments) и группы — важные элементы федерации, здесь не рассматриваются. Они будут вскоре проработаны в последующих материалах на этом сайте.
Провайдеры Волн
Протокол федерации волн позволяет каждому стать провайдером волн и обмениваться волнами с остальными. Например, организация может действовать как провайдер волн для своих членов, индивид может запустить сервер волн как провайдер волн для одного потребителя или членов семьи, и провайдер услуг Интернет может запустить обслуживающий сервис волн как еще один сервис Интернет для своих потребителей, в дополнение к email, службам мгновенных сообщений, ftp и т.д. В этой модели, Волны Гугл являются одними из множества провайдеров волн.
Провайдер волн идентифицируется по своему доменному имени (именам).
Потребители волн имеют свой волновой адрес, который состоит имени потребителя и домена провайдера волн, в той же самой форме, как и email адрес, а именно
Потребители волн имеют доступ ко всем волнам через своего провайдера волн. Если волна имеет участника от другого провайдера волн, все их провайдеры волн поддерживают копию волны и обслуживают ее для своих потребителей волны. Провайдеры волн обмениваются обновлениями волн со всеми другими, использующими протокол федерации, который мы описываем ниже. Для любого отдельно взятого потребителя волн, ответственность по аутентификации (использование кукисов, паролей и т.д.) и локальному управлению доступа возлагается на провайдера волн в домене потребителя.
Волны, Вейвлеты и Идентификаторы
Волна состоит из набора вейвлетов (элементарных волн). Если потребитель имеет доступ к вейвлету, то он называется участником этого вейвлета. Каждый вейвлет имеет список участников и набор документов, которые верстают его содержание. Различные вейвлеты волны могут иметь разный список участников. Копии вейвлетов распространяются между всеми провайдерами волн, которые имеют хотя бы одного участника в этом вейвлете. Один особый среди таких провайдеров волн, имеет определяющую копию этого вейвлета. Мы говорим, что этот конкретный провайдер является хостером этого вейвлета.
Когда потребителю приходит волна, ему доставляется ее представление, а именно: набор вейвлетов в волне, в которой он становится участником (напрямую или косвенно, через членство в группе). В общих чертах, различные потребители имеют разные представления для одной волны. Например, конкретные данные для потребителя волны, такие как статус прочитано/непрочитано в волне, хранятся во вейвлете пользовательских данных волны только для участвующих в ней потребителей. Вейвлет пользовательских данных отображаются в представлении волны только этому участнику. Другим примером является приватные ответы внутри волны, которые отображаются как вейвлет с ограниченным списком участников. Вейвлет приватных ответов появляется в представлении волны только ограниченному списку пользователей.
Волна идентифицируется глобальным уникальным id волны, который представляет собой пару из id и доменного имени. Доменное имя указывает провайдера волны, который порождает волну.
Вейвлет имеет свой вейвлет id, который уникален внутри своей волны. Подобно id волны, вейвлет id является парой из доменного имени и строки id. Доменное имя в id вейвлета играет особую роль: оно указывает провайдера волны, который является хостером вейвлета. Вейвлет хостится у провайдера волны того участника, который создал вейвлет. Провайдер волны, который является хостером вейвлета, отвечает как за операциональные преобразования, так и за исполнение операций во вейвлете и за обмен примененных операций с провайдерами волн всех участников вейвлета.
Вейвлеты в одной и той же волне могут хостится у разных провайдеров волн. Например, вейвлет пользовательских данных всегда хостится у провайдера волн потребителя, независимо от того, где обслуживается остальная часть волны. На самом деле, пользовательские данные не являются федеральными, т.е. ими не обмениваются с другими провайдерами. Другим примером является вейвлет приватных ответов. Конкретный простой пример этого — когда все участники приватных ответов принадлежат одному и тому же провайдеру волны. В таком случае провайдер волн не обменивается вейвлетом приватных ответов с другими провайдерами волн, у которых хостятся другие ее вейвлеты.
Архитектура Обслуживающих Сервисов Волн
Провайдер волн оперирует обслуживающим сервисом волн на одном или больше серверах сети. Центральной частью сервиса волн является хранилище волн, которое хранит операции вейвлета, и сервер волн, который правит операции вейвлета с помощью операциональных преобразований, а так же записывает и читает операции вейвлета из хранилища волн. Обычно сервис волн обслуживает волны для потребителей провайдера волн, которые подключены к клиентской части сервиса волн (см. "Модель данных Гугл Волн и клиент-сервер протокол"), и мы должны иметь это ввиду в последующем описании описании архитектуры сервиса волн. Еще более важно, для целей интеграции, что сервис волн обменивается волнами с участниками от разных провайдеров, связываясь с серверами их провайдеров волн. Обслуживающий сервис волн использует два компонента для пирингового обмена с другими провайдерами волн — "хост федерации" и "удаленный узел федерации". (В ранней ревизии этой рабочей спецификации эти компоненты были названы как "шлюз федерации" и "прокси федерации", соответственно). Они описываются в следующем разделе.Сервер волн у конкретного провайдера волн обслуживает представления волн для локальных участников, т.е. участников из своего домена. Как было описано ранее, копии вейвлетов поставляются всем провайдерам волн, которые имеют участников в этом вейвлете. Копии вейвлета у конкретного провайдера могут быть как локальными, так и удаленными. Мы используем термин "локальный вейвлет" и "удаленный вейвлет", ссылаясь на два таких типа копий вейвлета (в обоих случаях мы ссылаемся на копии вейвлета, а не на сами вейвлеты). Представление волны может содержать оба типа копий вейвлета одновременно.
У конкретного провайдера волн локальными вейвлетами являются те, что созданы у этого провайдера, а именно: теми потребителями, которые принадлежат к провайдеру вейвлета. Сервер волн является ответственным за обработку операций вейвлета, передаваемых ему локальными участниками и удаленными участниками от других провайдеров. Сервер волн управляет многопоточностью, упорядочивая передаваемые операции вейвлета относительно друг друга, используя операциональные преобразования. А так же он проверяет их корректность перед применением на локальном вейвлете.
Удаленные вейвлеты хостируют другие провайдеры волн. Сервер волн поддерживает кэшированные копии локально и обновляет их операциями вейвлета, которые получает от хостирующих провайдеров волн. Когда локальный участник отправляет вейвлетную операцию удаленному вейвлету, сервер волн пересылает операцию серверу волн хостирующего провайдера. Когда преобразованная и примененная операция возвращается обратно, она применяется на кэшированной копии. Доступ на чтение локальным участникам дается из кэшированной копии без обращения к хостирующему провайдеру волн.
Все локальные и удаленные вейвлеты хранятся в устойчивом от сбоев хранилище волн, входящему в сервер волн.
Мы говорим, что провайдер волн находится "против течения" относительно локальных вейвлетов и что он находится "по течению" по отношению к его удаленным вейвлетам.
Хост Федерации и Удаленный узел Федерации
Обслуживающий сервис волн использует два компонента для пирингового обмена с другими провайдерами волн — "хост федерации (federation host)" и "удаленный узел федерации (federation remote)".
Хост федерации обеспечивает коммуникацию локальных операций вейвлета, т.е. операций на локальном вейвлете:
- Выдает новые операции вейвлета, которые уже применены в локальном вейвлете, провайдерам волн каждого удаленного участника.
- Удовлетворяет запросы старых операций вейвлета.
- Обеспечивает согласование запросов операций вейвлета.
Удаленный узел федерации обеспечивает коммуникацию удаленных операций вейвлета и является компонентом провайдера волн, который связывается с хостом федерации вверх по течению провайдеров волн:
- Получает новые операции вейвлета, выдаваемых ему провайдерами волн, которые являются хостерами вейвлетов.
- Запрашивает старые операции вейвлета у хостирующих провайдеров волн.
- Отправляет операции вейвлета хостирующим провайдерам волн.
Хост федерации провайдера волн вверх по течению связывается с удаленным узлом федерации провайдера волн вниз по течению для передачи операций вейвлета, которые хостируются провайдером волн вверх по течению.
Для того, что бы сделать доставку операций от хоста до удаленного узла надежной, протокол федерации имеет следующие механизмы. Хост федерации поддерживает (в отказоустойчивом хранилище) очередь исходящих операций для каждого удаленного домена. Операции находятся в очереди до тех пор, пока их получение не будет подтверждено от получающего их удаленного узла федерации. Хост федерации будет постоянно пытаться установить связь и пересоединиться после любого обрыва связи (повторяя попытки с экспоненциальной задержкой). Когда связь восстанавливается, хост федерации будет передавать операции из очереди. Получающий удаленный узел возвращает подтверждения передающему хосту федерации и только тогда, когда подтверждение получено, передающая сторона удаляет из очереди подтвержденные операции.
Пример
Рассмотрим для примера вейвлет с id вейлета W (acmewave.com, conv+090528), где acmewave.com является доменом, а "conv+090528" id-строкой (структуру которой мы здесь не рассматриваем). id вейвлета предписывает, что W хостится у провайдера волн Acmewave. Предположим, что W имеет участника feddy@federati.com из другого домена federati.com.
Все операции вейвлета W, отправленные как локальными, так и удаленными участниками, преобразовываются и применяются в W, сохраняются в локальном хранилище волн провайдера Acmewave, и затем примененные операции передаются на федеральный хост, который выдает их federati.com. Хост Acmewave устанавливает связь с удаленным узлом Federati и отсылает операции через соединение.
Иногда получателю бывает нужно получить прошлые операции от отправителя. Типичным является случай, когда получены операции для вейвлета и при этом получатель не имеет всех предыдущих операций для вейвлета. (Это условие легко проверяется, потому что примененные операции содержат в себе последовательные номера версий.) В этом случае получающий удаленный узел федерации устанавливает соединение с доменом, который хостирует вейвлет и запрашивает прошлые операции, которые у него отсутствуют. (Один из случаев происходит, когда у сервера волн может создаться определенный интервал в истории операций: от момента времени t1 при удалении вейвлета, когда в его домене нет участников этого вейвлета, и до момента времени t2, когда участник из его домена присоединяется к тому же вейвлету. Хост федерации отвечает, посылая новую операцию AddParticipant, и пересылает все последующие новые операции удаленному узлу федерации, но последний должен сам откатиться и запросить предыдущие операции.)
Тем же способом потребитель может отправлять операции удаленному вейвлету, а именно позволяя хосту федерации подключаться к удаленным узлам федерации и отправляя операции на свой сервер волн.
Предположим что есть другой вейвлет, хостируемый Federati, т.е. домен id вейвлета — fedrati.com, и этот вейвлет имеет участника user@acmewave.com. Тогда хост Federati и хост Acmewave станут связываться друг с другом таким же образом.
Протокол
Сетевой протокол между хостами и удаленными узлами федерации называется "Протокол федерации Волн Гугл". Он является открытым расширением XMPP протокола обмена сообщениями через Интернет. Некоторые из ключевых полезных возможностей XMPP, которые используются в протоколе федерации волн — определение IP адресов и портов, используя SRV записи, TLS аутентификация и шифрование соединений. См. "Google Wave Federation Protocol".
Транспорт XMPP шифрует операции на транспортном уровне, таким образом, он обеспечивает криптографическую защиту только между серверами, соединенными друг с другом напрямую. Дополнительный уровень шифрования обеспечивает сквозная (end-to-end) аутентификация между провайдерами волн, использующая криптографические подписи и сертификаты, позволяя всем провайдерам вейвлета верифицировать свойства операций. В частности, провайдер волн внизу по течению может удостовериться, что провайдер волн не подделывает операции вейвлета, а именно: невозможно подделать требования (1) операций вейвлета, исходящие от потребителя другого провайдера волн или (2) того, что происходит в другом контексте. Это относится к ситуации, когда два потребителя от разных, надежных провайдеров волн, скажем love.com и peace.com, являются участниками вейвлета, который хостится у зловредного провайдера волн evil.com. Протокол требует от love.com подписывать операции своего потребителя сертификатом love.com и peace.com должен подписывать операции своего потребителя сертификатом peace.com. Эти подписи передаются вместе с операциями и evil.com должен хостировать подписи вместе с операциями. Кроме того, love.com и peace.com будут проверять подписи всех операций, которые пересылает evil.com. Это делает невозможным для evil.com изменять или подделывать содержание сообщений от потребителя love.com, которыми он делится с peace.com, и наоборот. Все подписывания и верификации осуществляются провайдерами волн, но не клиентским программным обеспечением конечных потребителей.
Спецификация протокола требует, чтобы провайдеры волн, соединяясь с использованием протокола федерации, должны обеспечивать аутентификацию используя криптографически безопасные TLS механизмы. Кроме того, рекомендуется, чтобы они использовали TLS для шифровки трафика между собой. Клиент-сервер протокол и протокол федерации не обеспечивают сквозную (end-to-end) аутентификацию или шифрование между конечными потребителями. Провайдер волн должен обеспечивать аутентификацию своих конечных потребителей, и им рекомендуется предоставлять своим конечным потребителям безопасные шифрованные соединения в своих клиентской части обслуживающего сервиса волн. Сочетание безопасных соединений между обслуживающими сервисами волн и безопасных соединений между потребителями и между самими обслуживающими сервисами волн обеспечивает достаточный уровень безопасности между конечными клиентами.
Ссылки:
Jochen Bekmann, Michael Lancaster, Soren Lassen, David Wang: "Модель данных в Волнах Гугл и Протокол клиент-сервер".
David Wang, Alex Mah: "Операциональные Преобразования в Волнах Гугл".
Danny Berlin: "Протокол федерации Волн Гугл".
Lea Kissner, Ben Laurie: "Генеральная доверенность в Федерации".
понедельник, 3 августа 2009 г.
Google Wave Developer Preview at Google I/O 2009
Итак выкладываю ролик Google Wave Developer Preview at Google I/O 2009, который переведён на русский (субтитры). Многие мне пишут и спрашиваю, а в чём основные фишки Google Wave, а зачем он нужен и так далее, поэтому я решил опубликовать вам ролик, который для нас перевели участники группы переводчиков HabraTranslation.
Наконец вы узнаете то, что так давно хотели узнать, но стеснялись спросить :)
Del.icio.us : google I/O, google wave
воскресенье, 2 августа 2009 г.
Установка сервера Google Wave (FedOne) на локальной машине под Windows
Зачем? Ну, у меня уже был опыт комфортной разработки сайтов на своем «локальном интернете» (пакет Denwer включает Apache, PHP, MySQl и т.д.). Почему бы не поработать таким же образом с локальным волновым сервером, подумал я?
Сказано-сделано и вот, что у меня получилось. На все про все ушло часа три, причем большую часть этого времени занимала возня с установкой дополнительного программного обеспечения.
Процедура установки волнового сервера подробно и с картинками описана по-английски. Есть также русский перевод этой инструкции (сделал Иво Димитров aka Darwin).
Но установка под Windows имеет некоторые особенности, о которых я и хочу написать.
A. Необходимое программное обеспечение
Сразу скажу, что для установки волнового сервера мне понадобилось скачать:
а1. исходные тексты FedOne.
Их можно посмотреть и получить здесь.
a1.1. Mercurial
Поскольку исходники хранятся в системе управления исходными кодами Mercurial, то для их скачивания мне пришлось установить программу-клиент TortoiseHg под Windows.
В настоящее время это версия 0.8.1. — TortoiseHg-0.8.1-hg-1.3.1.exe (14.4Mb)
После установки в контекстном меню виндовского Проводника появляется субменю TortoiseHg. Создайте папку у себя на диске, установите на нее курсор, нажмите правую кнопку мыши и объявите эту папку локальным репозиторием (хранилищем) исходных кодов. Затем синхронизируйте ее с онлайновым репозиторием кодов FedOne — в Repository Settings укажите онлайновый адрес http://code.google.com/p/wave-protocol/source и закачайте файлы. И, наконец, сделайте рабочую копию этих кодов. Для этого выберите пункт Clone Repository, укажите в какую папку выложить исходники.
а2. Openfire
Это кросс-платформенный сервер взаимодействия в реальном времени, основанный на протоколе XMPP (Jabber).
Для Windows в настоящее время есть версия 3.6.4.
Предлагается для загрузки два варианта, я выбрал тот, в который включена Java RE (openfire_3_6_4.exe, 20.9Mb). Но можно, наверное, скачать и более компактный (7.49Mb) архив без JRE (а Java установить отдельно на следующем этапе).
a3. OpenSSL
Он понадобится нам для создания сертификатов нашего сервера. Я взял Windows-версию OpenSSL. А именно Light версию (весит 1Mb, есть еще 7-мегабайтная версия для разработчиков софта, но для наших целей сейчас она излишня).
a3.1.Visual C++ 2008 Redistributables
При установке оно потребовало установить Visual C++ 2008 Redistributables, пришлось скачать и установить еще и этот пакет (1.7Mb). Для этого идем на сервер Microsoft.
Замечу, что после установки VCR и перезагрузки системы инсталлятор OpenSSL все равно ругался и уверял, что VСR в системе не установлен и без него он работать не будет. Но после нажатия «OK» прекрасно все установил и заработал.
a4. Java
JavaRE6 была у меня в системе вместе с Eclipse (возможно обновилась при установке OpenFire). Но при сборке исходных кодов Ant потребовал еще файл tools.jar (около 13Mb). Он, как выяснилось, приходит вместе с пакетом для разработчиков JavaJDK. Что ж, поставим и JavaJDK.
a4.1. JavaJDK
Актуальная на данный момент версия Java6 Update14 (75Mb) доступна для закачки. (Можно взять и тут).
a5. Java-утилита Ant для сборки
Я скачивал версию 1.7.1. (10Mb).
С Ant пришлось повозиться по той причине, что ему, как я писал выше, потребовался tools.jar. Кроме того, я работаю в Windows под аккаунтом «Вадим», написанным кириллицей. Соответственно и каталоги для этой учетной записи Windows делает с кириллическими (русскими) названиями. Ant при сборке считал эти пути ошибочными и никак не хотел собирать проект.
Решил эту проблему установкой «правильных» путей (без «крокозябр») в переменных ANT_HOME, JAVA_HOME и т.п. Кстати, в доках рекомендовано установить в config.sys такую строку для работы с длинными путями: shell=c:\command.com c:\ /p /e:32768
Переменные в Windows можно установить так: правой кнопкой мыши по иконке «Мой компьютер», выбираем «Свойства». Вкладка «Дополнительно», кнопка «Переменные среды».
B. Итак, теперь собственно об установке волнового сервера.
Весь процесс разбивается на четыре этапа:
b1. настройка и запуск XMPP-сервера OpenFire
b2. генерация сертификатов OpenSSL
b3. установка волнового расширения для OpenFire, т.е. собственно настройка вашей копии сервера FedOne и его сборка
b4. запуск сервера и клиента к нему
Пройдем этот путь:
b1. Установка и настройка сервера OpenFire
Настройка OpenFire, пожалуй, самая простая часть установки сервера. Запускаете инсталлятор и следуете указаниям инструкции. По-английски или по-русски.
Поэтому повторяться не буду, но для нашего случая есть две тонкости — а) в качестве домена своего XMPP-сервера укажите "localhost", b) запомните, как назвали субдомен, используемый вашим FedOne (я назвал его "wave"), и секретное слово (shared secret) к нему (в моем примере — "foobar"). Это нам понадобится при компиляции и запуске сервера.
b2. Генерация сертификатов
По-английски описано здесь.
Все элементарно, Ватсон. Идем в C:\OpenSSL\bin\ и запускаем openssl.exe с параметрами (см. ниже). Нужно будет ответить на несколько вопросов — код страны, название города и т.п. и получить в итоге 2 файла.
Можно сделать такой genss.bat-файл:
openssl genrsa 1024 | openssl pkcs8 -topk8 -nocrypt -out %1.key
openssl req -new -x509 -nodes -sha1 -days 365 -key %1.key -out %1.cert
и запускать его так: genssl.bat wave, где wave — имя для генерируемых файлов ключей и сертификата (wave.cert и wave.key).
Кладем сгенерированные файлы в каталог с исходниками волнового сервера.
b3. Компиляция сервера и клиента
Просто перейдите в папку с исходниками сервера и скажите: «ant». (Можно предварительно прогнать тест — «ant test»).
Если у вас правильно указаны переменные и пути, то после компиляции вы получите 2 файла (fedone-0.2.jar и fedone-client-0.2.jar) в папке /dist
b4. Запуск вашего сервера и клиента к нему
Волнующий момент. :) Сделайте 2 bat-файла, для запуска сервера run-server.bat и для запуска клиента run-client.bat.
run-server.bat:
java -jar dist/fedone-0.2.jar --client_frontend_hostname=127.0.0.1 --client_frontend_port=9876 --xmpp_component_name=wave --xmpp_server_hostname=localhost --xmpp_server_ip=localhost --xmpp_server_port=5275 --xmpp_server_secret "foobar" --xmpp_server_ping="" --certificate_private_key=wave.key --certificate_files=wave.cert --certificate_domain=localhost --waveserver_disable_verification=true
p.s. Несколько пояснений: вот и пригодились нам «localhost» (наш локальный домен), «wave» (имя расширения для OpenFire) и «foobar» (секретное слово).
run-client.bat:
java -jar dist/fedone-client-0.2.jar %1@localhost 127.0.0.1 9876
Запуск клиента: run-client.bat имя_пользователя, например: run-client.bat vadbars
Итак, все готово? Он сказал, «Поехали!»
Раз. Запускаем OpenFire. В трее — желтая лампочка.
Два. Запускаем run-server. Досовское окно с протоколом запуска. Посмотрите в сообщениях, что сервер нашел OpenFire и подключился к нему. Можно посмотреть это же в админке самого OpenFire (раздел «Extentions»).
Три. Запускаем run-client. Тоже черно-белое досовское окно с какими-то малопонятными значками. А вы чего ждали? :)
Можно полюбоваться на скриншоты.
C. Работа с волнами на своем сервере и со своим клиентом
В данный момент (август 2009 года) FedOne поддерживает всего несколько команд (да-да, пока нет никакого GUI!):
/connect user@domain server port Cоединиться с server:port как участник user@domain
/open entry open Открыть волну, которая есть у вас во Входящих. Надо указать номер волны (от 0). Например: /open 1
/new Создать и открыть новую волну
/add participantId Добавить участника к волне
/remove participantId Удалить участника из волны (хе-хе, этого пока нет в клиенте Gogoole Wave Sandbox! Наш сервер круче. :)
/quit Завершить работу клиента
Автор: Вадим Барсуков
Создай свою армию роботов!
После просмотра вы сможете создать своего первого робота для Google Wave!
Презентация также доступна для полноэкранного просмотра в интернете и для загрузки в виде PDF-файла.
Скажем все спасибо Вадима Герасимова!
Взято с Google Wave Russia
суббота, 1 августа 2009 г.
Установка Google Wave Server (Прототип)
Введение
Установка исходного кода Google Wave Federation Prototype Server
Исходный код Wave Federation Prototype Server поставляется в виде Java приложения, что соответствует XEP-0114, и является Jabber Component Protocol (компонентом Jabber протокола). В примере ниже мы покажем, как установить Wave Federation Prototype Server как плагин к Openfire XMPP сервер, но он должен так же работать с любым XEP-0114 совместимом сервере.
Для запуска прототипа сервера нужно сначала установить Openfire сервер. Данная инструкция Openfire сервера описывает шаги для Debian (Ubuntu) систем и если у вас возникнут проблемы или вопросы относительно установки, То обращайтесь к Openfire сообществу на их сайте.
Предварительные сведения
Openfire и Wave Federation Prototype Server разоработаны на Java поэтому вы должны убедиться, что у вас установлена Java на вашей машине. Несмотря на то, что WFPS должен работать на любой системе с Java 6 эта инструкция описывает шаги только для Debian (Ubuntu) систем.
Mac OSX
Для Mac OSX установите Java 6 с http://developer.apple.com/java/download/.
После установки Java вам надо создать переменные окружения:
$ export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
$ export PATH=$JAVA_HOME/bin:$PATH
Теперь пройдите на сайт Openfire и скачайте Mac OSX версию Openfire.
Debian/Ubuntu
Установка Java 6:
$ apt-get install sun-java6-jre sun-java6-fonts
Теперь скачайте и установите Openfire сервер:
$ wget http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_3.6.4_all.deb
$ sudo dpkg -i openfire_3.6.4_all.deb
$ sudo /etc/init.d/openfire restart
Конфигурация Openfire (все платформы)
После установки Openfire сервера пройдите по ссылке http://localhost:9090 в вашем браузере. Замените домен на ваш, если вы устанавливаете не на локальный компьютер. Весь процесс установки будет происходить через мастер и будем ставить значения по умолчанию для простоты.
Конфигурация Openfire Wave плагина
Перезапустите сервер после окончания настройки. На Debian/Ubuntu это делается так:
$ sudo /etc/init.d/openfire/restart
После того, как перезапустите сервер войдите в Openfire как 'admin' и пароль, который вы указали.
Затем идём в Server -> Server Settings -> External Components.
Включите внешние дополнения на порту 5275 и выберите секретное слово для расшаривания этого компонента. Нажмите Сохранить. Теперь добавьте 'wave' как доверительный компонент. Для этого пишем субдомен 'wave' и напишите опять секретное слово, которое вы написали до этого. Номер порта и секретное слово служат для возможности подключения Wave дополнения.
Теперь идём в Server -> Server Settings -> Security Settings. Для "Server Connection Security" выбираем "Custom" и включаем "Server Dialback". Так же проверьте, что флажок "Accept self-signed certificates" установлен.
Защита
Следующие изменения не являются обязательными, но если вам нужна хорошая защита, то это будет хорошей практикой.
- Идём в Server -> Server Settings -> Registration and Login. Выключим "Inband Account Registration". Выключим "Change Password". Выключим "Anonymous Login"
- Включим компресию в "Compression Settings"
- Выключим прокси в "File Transfer Settings"
Установка дополнения Wave
Теперь скачиваем Federation Prototype Server и извлекаем всё содержимое. Скачать можно с SVN
Для запуска расширения вам будут нужны некоторые из параметров, который вы использовали для настройки Openfire сервера. Это номер порта, секретное слово, имя сервера и, наконец, имя компонента, которое у нас - 'wave'.
Wave сервер требует ряда сертификатов, используемых для подписания. Дополнительную информацию см. на странице Wiki.(прим. переводчика: Чуть позже сделаю перевод, как создавать сертификаты)
Отредактируйте run-server.sh скрипт с правильными настройками. Расшифровка аргументов:
Параметр | Описание |
client_frontend_hostname | ip к которому будет подключаться клиент |
client_frontend_port | порт к которому будет подключаться клиент |
xmpp_server_hostname | XMPP сервер хост (например gogola.org) |
xmpp_component_name | XMPP компонент Wave сервера. В нашем случае "wave" |
xmpp_server_ip | Адрес XMPP сервера, где у нас wave компонент |
xmpp_server_port | Порт XMPP сервера, где опять таки, наш компонент |
xmpp_server_secret | Секретно лово компонента |
xmpp_server_ping | Пинговать сервер после подключения? Если пусто, то пинговать не будет |
certificate_domain | Домен сертификата который мы использовали при его создании |
certificate_files | файл сертификата. (yfghbvth username.cert) |
certificate_private_key | Приватный ключ сертификата (PKCS#8-PEM) (например username.key) |
waveserver_disable_verification | Проверять сертификат? true - да, flase - нет |
После того, как вы отредактируете скрипт сервера вам надо будет скомпилировать сервер и запустить его:
$ ant dist
$ run-server.sh
Запуск клиента
Отредактируйте run-client.sh скрипт (смотри параметры внутри скрипта), затем запустите его:
$ run-client.sh <username>