пятница, 20 августа 2010 г.

Google прекратил поддержку и работу над Google Wave

Google прекратил поддержку и работу над Google Wave

Google прекратил поддержку и работу над Google Wave

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

вторник, 25 мая 2010 г.

Google Wave теперь открыт для всех!

image
В свете последних событий, а именно мой переезд в Москву и заморозка блога, я не написал одну из самых главных новостей!
Собственно, свершилось то, о чем все столько говорили (да подзабыли). Wave стал доступен для всехпользователей, имеющих Google Account!
А вот и соответствующая запись в официальном блоге гугловолны, которая вкратце гласит:
  • всем спасибо, вы — отличная публика :)
  • пользуйтесь на здоровье, не забывайте раздавать инвайты (25 шт. максисмум)
  • администраторы Google Apps в сфере бизнеса, образования и т.д. могут просто включить волну и, кто бы мог подумать, совершенно бесплатно
  • волна все еще прописана в разделе labs
  • уже есть богатый опыт использования волны с примерами
  • волна тут, волна там — вокруг сплошное цунами.

понедельник, 24 мая 2010 г.

Организация работы с помощью Google Wave

Мы ― небольшой коллектив (30 человек) который ведет один немаленький и достаточно успешный проект. У нас, как и у многих IT-фирм, были проблемы с документацией, планированием и организацией нашей работы. Вот уже полгода для коллективной работы мы используем Google Wave, который помог значительно продвинуться в решении вышеперечисленных проблем. И это несмотря на то, что продукт даже еще не в бета-версии.


До перехода на Google Wave в течение 5 лет мы использовали Trac, полгода ― Microsoft Project, знакомились и тестировали почти все системы планирования и организации работы. Но проще и быстрее остальных систем у нас прижился google wave, и мы очень этому рады. Возможно, крупным компаниям, у которых внедрены ERP-системы, наши достижения покажутся смешными, но нам Google Wave действительно облегчил жизнь.

Цель этой статьи ― привлечь внимание к Google Wave, к коллективной работе в Google Wave, разработкам (с нами или без нас) для Google Wave (да и вообще всего, что связано с коллективной работой). Мы очень хотим, чтобы работа стала еще удобнее, интереснее и эффективнее.

С первого взгляда

Первый плюс, который сразу бы хотелось отметить ― это низкий порог вхождения. Разобраться с тем, как пользоваться Google Wave, несложно. Половина наших сотрудников совсем не из IT-области, но после небольшой презентации и обучения, обсуждения всех задач, перешли в волну достаточно легко.

Второй плюс ― это то, что сервис находится в облаке, и нам не надо тратить собственные силы и средства на поддержку своего сервера. Хотя, если у нас появится необходимость или паранойя, мы cможем перенести все это на свой Wave-сервер.

image

Правильная волна

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

Но до того, как начать ознакомление, необходимо хотя бы коротко рассказать некоторые правила, которых мы придерживаемся:
  • У каждой задачи должен быть ответственный человек, который отвечает за решение этой задачи.
  • У каждой задачи должны быть сроки. Даже если сроки не ясны, указываем примерные.
  • Нельзя ни в коем случае допускать ситуации с просроченными задачами, но их можно перенести с описанием причины переноса сроков.

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

Как постановка задачи происходила до внедрения Google Wave?

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

Решение проблем через Google Wave

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

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

Тэги пишутся в круглых скобках в самой задаче, непосредственно возле текста задачи. Первые две буквы тэга означают исполнителя задачи (Фамилия Полное имя, например, ИП — Иванов Петр). Третья буква тэга ― статус задачи (пример: н — Новая задача). Шутки, что мы не возьмем человека на работу, если его инициалы повторяются, у нас уже были. В данный момент мы все легко можем вспомнить инициалы всех сотрудников, и 2 буквы можно написать очень быстро.

Также в тэге указывается deadline (конечный срок выполнения задачи).

Пример тэга: (тп н 18.05)

Расшифровка: Новая задача Тестовому Пользователю, срок выполнения ― 18 мая.

У нас это обычно выглядит следующим образом:

image

Когда задача выполняется, тэг исправляется исполнителем на соответствующий. Задача проверяется постановщиком, и если он ее не принял, то заново ставит тэг «н». Если исполнитель не может сделать задачу вовремя, он отписывается по состоянию дел, называет новый срок и меняет deadline в исходном тэге.

В панели navigation в searches можно сделать соответствующие для себя поисковые запросы. И назвать их нативно (к примеру, «невыполненные задачи», «обсуждаемые задачи», «все мои задачи» и т.д.).

Формат записи deadline

Записываем день и номер месяца (с ведущим нулем):
  • (тп н 19.02) 19 февраля.
  • (тп н 19.02 12:00) в 12 часов дня
  • (тп н 19.02 09.02) первый срок дедлайна 9-го числа, который перенесли на второй срок 19го.
  • (тп н) Задача без даты считается задачей, которую надо сделать сегодня. Забегая немного вперед, в эту задачу наш робот автоматически поставит текущую дату.

Статусы
  • н — нерешенная задача
  • в — задача требует дополнительных вопросов (этот тэг для того, чтобы задача пропала из списка задач на которые стоит еще обращать внимание, до появления новой информации.)
  • р — реализованная задача.

Примеры поисковых запросов

Кавычки в запросах обязательны.
  • in:inbox "(тп н" — все нерешенные задачи тестового пользователя.
  • in:inbox "(тп р" — реализованные задачи тестового пользователя.
  • in:inbox "(тп н 21.02" все нерешенные задачи 21 февраля тестового пользователя. Этот запрос, к сожалению, добавить в используемые нельзя, и каждому придется писать этот запрос ежедневно вручную, дописывая текущую дату.
  • in:inbox "(?? н" — все нерешенные задачи.
  • in:inbox "(?? н 21.02" — все нерешенные задачи всех пользователей на 21-е февраля.

Поисковые запросы можно сохранить. И быстро открывать в поиске свои задачи.

image

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

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

image

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

среда, 10 февраля 2010 г.

[Google Buzz] Google начнет делать из Gmail социальную сеть?

Сервис Gmail станет следующим большим шагом Google в стройный ряд социальных ресурсов. Согласно сведениям The Wall Street Journal, популярный почтовый сервис скоро обзаведется дополнительными возможностями, такими как обмен контентом с друзьями и обновление статуса пользователя.

Как отмечает WSJ, пользователи Gmail уже могут изменять свой статус, используя для этого чат встроенный в веб интерфейс Gmail. Сейчас, эта функция больше походит на статусы традиционных клиентов мгновенных сообщений, однако, после нового шага к социальной платформе, Gmail предоставит возможность просматривать единый список обновления статусов ваших друзей, отсортированный по времени добавления, как это происходит на Facebook или в Twitter'е.

Обновление статусов будут происходить как непосредственно из Gmail, так и из ряда других сервисов. По мнению WSJ, принадлежащие Google сервисы YouTube и Picasa так же будут интегрированы в эту систему. Несомненно, загадкой является то, будет ли эта система от Google поддерживать интеграцию с Twitter'ом и Facebook'ом.

Если так, то новый сервис Google скорее будет походить на TweetDeck или Seesmic, т.е. будет просто агрегировать активность ваших друзей из различных социальных сервисов в одном месте, а так же предоставлять возможность обновлять статусы в этих службах непосредственно из Gmail. Если же нет, то новый сервис Gmail можно рассматривать, как серьезного конкурента Twitter'у и Facebook'у, учитывая многомиллионную аудиторию почтового сервиса от Google, приверженцы которого вполне могут создать социальный медиа сервис нового поколения.

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

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

тут перевод заканчивается и говорит переводчик:
Подобные слухи ходили давно. Есть Orkut, очень популярный в Бразилии; есть задатки социальных движений на YouTube и уж точно в Google Reader. Осталось только по умному, рассудительно и не спеша, соединить это в единое целое. А уж рассудительности Google не занимать.
Кто за?

Пруфлинк: Google Buzz

Автор: Adam Ostrow
Перевод:
Артём Лоенко

понедельник, 8 февраля 2010 г.

Русскоязычные Office Hours - 01.02.10 (ЗАКРЫТЫ)

Вот и прошёл первый Office Hours в России. Сейчас волна закрыта уже на запись, но всегда можно почитать о чём писали. Напомню ссылку: http://bit.ly/bfKBBK В виду того, что мне пришлось уехать в другой город из Москвы (в Оренбург), то я не смог отследить обсуждение и даже поучаствовать. Мне очень жаль.

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

Существует ли поддержка Ruby on Rails?
Alexander Belozor (ABel):

Руби вообще пока в Google инструментах не поддерживается, к сожалению. Тут нужна активность пользователей. )))


Maxim qMax Vasiliev:

была инициатива:

http://intertwingly.net/blog/2009/06/01/Wave-Robot-Ruby-Client но непонятно чем кончилась.

И для embed api тоже чтото есть:http://i.collectthoughts.com/embedding-a-google-wave-into-ruby-on-rails например.

Чисто теоретически там ничего хитрого нет, кроме того, что покамест роботы работают только с appengine, где с руби не очень.


Кто-нибудь знает, есть ли уже ресурсы на движке Google Wave (не гугловские)?

Vadim:

Да, и даже имеются исходные тексты - http://code.google.com/p/pygowave-server/

А сам сервер вот - http://pygowave.net/


Волна за декабрь-январь - что нового?

Vadim Gerasimov:

Check-boxes для выбора волн в поиске. Изменение доступа участников. Уже появилась edit кнопка в тулбаре. Возможно скорое появление руссифицированой версии.

В API будет добавлена поддержка нового Python и Java API для роботов. Wave должна работать гораздо быстрее на Хроме.


Обещанный третий режим доступа (помимо рид-онли и полного доступа) когда примерно можно ждать? Это дело ближайшего времени или будет попозже?

Vadim Gerasimov:

Это из категории попозже.



Памела добавила в "песочнице" папку для extensions. Это будет перенесено в превью?

Vadim Gerasimov:

Со следующим перезапуском.



Google Chrome OS планируется выпускать на устройствах на базе intel Atom, соответственно планируются какие-нибудь работы по оптимизации либо самой Chrome OS либо Google Wave?

LZSaver:

Браузер Chrome к моменту релиза Chrome OS или Google Wave уже будет версии 10-ой, так что скорость и там, и там, и там поднимут.


Ну вот и все основные вопросы русскоязычных пользователей Google Wave. Ждите обновлений позднее и удачного дня!

пятница, 29 января 2010 г.

Первая тематическая онлайн-встреча сообщества русскоязычных разработчиков и пользователей Google Wave

За исходный пункт мы взяли т.н. Office Hours, которые проводятся для девелоперов командой Google Wave. Раз в две недели в "песочнице" (wavesandbox.com) открывается волна, в которой в течение часа присутствуют компетентные специалисты из Google Wave Team. Вы можете задавать им вопросы и оперативно получать на них ответы.

При явной полезности и важности этих мероприятий, участие в них может представлять трудность для пользователей из exUSSR:

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

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

Итак, в понедельник, 1 февраля 2010 года в 10:00 по московскому времени мы открываем первую волну на googlewave.com. В течение 1 часа она будет работать в активном режиме, затем будет переведена в статус read-only. Адрес волны - http://goo.gl/KbTl

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

Ведущими первой волны будут (по алфавиту):

- Вадим Барсуков (vadbars, Екатеринбург),
- Александр Белозор (ABel, С.Петербург),
- Максим Васильев (qMax, Новосибирск),
- Вадим Герасимов (gerculanum, руководитель группы разработки API гаджетов Google Wave, Сидней),
- Владимир Иванов (elGephest, Киев),
- Евгений Смоланка (eugene, Ужгород).

Приглашены к участию в проекте также Алексей Шелестенко (Google Россия), Дмитро Шоломко (Google Украина), координаторы отделений GTUG России и Украины Алексей Иванкин, Сергей Каюк, Антон Шалеев, Павел Прудников и другие.

Предполагается, что такие встречи будут периодическими и будут проходить один раз в две недели. Состав ведущих, а также тематика будет меняться. Если вы чувствуете, что готовы стать ведущим и рассказать о своем опыте в каком-то вопросе - предлагайте тему и дату. Обсуждение можно вести здесь (сообщите желающим адрес этой волны - http://goo.gl/ande), либо в гуглогруппе GWR - http://goo.gl/mBv9

До встречи в Волне!

UPD: Скорее всего я смогу организовать прямую трансляцию для тех, у кого нет инвайта или доступа к Google Wave. Буду выбирать не всё, а только самое полезное

четверг, 3 декабря 2009 г.

Инвайты на Google Wave

Так как уже в моду вошло раздача инвайтов, то думаю и мне стоит помочь тем людям, которые ещё не с нами в Google Wave. Для получения инвайта пишите в комментах или сразу мне на мыло [darwinium@гуглопочта] свой Google Account вида test@gmail.com.

Так же не смотрите, что на скриншоте всего 16 инвайтов. Поверьте! Инвайтов хватит на всех!!!

среда, 2 декабря 2009 г.

Десктопный клиент Google Wave для... Для всего!

Сразу следом за клиентом для Mac OS был найден другой клиент - Waver. Waver - это программа на Adobe Air, которая предоставляет доступ к Google Wave.

Waver включает в себя базовый функционал:
  • Список волн
  • Просмотр волны
  • Контакты
  • Создание новой волны

И как вы могли заметить - этот клиент базируется на версии для iPhone. То есть минимализм в интерфейсе и небольшие ограничения в функционале.

Скачать и установить можно в Adobe Marketplace

Ну и немного скриншотов!





Десктопный клиент Google Wave для Mac OS X

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

Основным клиентом для 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
Mind Map Gadget
Позволяет пользователям волны совместно создавать, редактировать простейшую иерархию данных/идей. Позволяет добавлять иконки (например для расстановки приоритета задач), а также голосовать за каждый из пунктов. Понятный интерфейс и минимум функций.

Plany


Страница Google Code
Ссылка на гаджет XML
Plany
Plany
Неплохой по функционалу планировщик задач. Дает возможность следить за выполнением той или иной задачи, указывать ответственное лицо, сроки начала и конца выполнения, а также состояние. С помощью сервиса Google Charts строит 2 графика: сколько человеко часов выделяется для той или иной задачи и диаграмму Ганта (иллюстрация плана, графика работ по какому-либо проекту) Полезный гаджет для организации рабочего процесса.

Code Snippet


Ссылка на Волну с гаджетом
Code Snippet
Подсветка синтаксиса. Особенности:
— Более 30 языков
— Возможность блокировки фрагмента (только для чтения) для предотвращения нежелательного редактирования другими
— Возможность совместной подсветки линий для оказания помощи в проверке кода

Napkin


Страница Google Code
Ссылка на гаджет XML
Napkin
Часто что-то легче объяснить на рисунке, чем на словах. Napkin — гаджет для Google Wave, написанный в Adobe Flex, который позволяет вам очень быстро делать небольшие зарисовки в вашей волне.

Retro Chat


Страница Google Labs
Ссылка на гаджет XML
Retro Chat
Данный гаджет позволяет вставить в волну компактный чат.

Спасибо пользователю Kuper за данную подборку

среда, 4 ноября 2009 г.

The Complete Guide to Google Wave \ Полное руководство по Google Wave

Ну вот и начали появляться книги и руководства по 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

Пользователь Хабрахабр freetonik в очередной раз порадовал нас своим скринкастом. И на этот раз о наших волнах.





P.S. Я обычно в блог пишу через блоггер программу, но вышел косяк и все мои последние посты не опубликовались, поэтому сейчас опубликую сразу пачку постов =) Читаем ))

среда, 21 октября 2009 г.

Google Wave на iPhone. Краткий обзор

Пользователь shifttstas сделал отличный обзор как Google Wave выглядит на мобильных устройствах и в частности на iPhone.

Как вы знаете Google Wave поддерживает только новые браузеры, у этого есть логичное объяснение, так как wave основан на очень мощной платформе из Java script то не каждый браузер может её запустить, но сегодня Google сделала поддержку Wave на iPhone


А так же в месте с версией для iPhone они добавили наконец поддержку показа кто онлайн.
При нахождении кого либо онлайн отображается зеленая точка
image


И так что бы попасть набирает в iPhone известный нам всем адрес wave.google.com, нас естественно перекидывает на https версию, после того как увидим окно
image

Нажимаем Go Ahead

И попадаем в
image

Одна из самых интересных вещей, что гаджеты работают!

image

А так же можно посмотреть на свой контакт список


image

Функция прокрутки времени Playback тоже работает


image

А вот и меню управления волной


image

Ну что же можно написать? Спасибо, Стас, что ты сделал такой обзор и будем как всегда ждать, когда всех пустят в 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/ — потом нас спрашивают о мыле и пароле и дают залить файло.

В базовом случае главных файлов в проекте будет три:

our_robot.py - собственно, код робота
app.yaml - нечто вроде манифеста
_wave/capabilities.xml - файлик, объявляющий эвенты, которые хочет слушать робот.

Питоновый API xml-ку кастати сам генерирует, на базе аргументов к robot.Robot, а вот для Java API надо писать ручками.

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

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. Там будет отображаться количество новых сообщений.

google-wave-notifier

Автор обещает работоспособность только для пользователей 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-структура максимально упрощена (не в ущерб стандартам) для того, чтобы настоящий дизайнер мог развернуться и сделать действительно красиво :).
sametimed в работе
Сайт, исходные коды, и war-пакет с текущим состоянием проекта находятся по адресу http://code.google.com/p/sametimed
Сейчас у меня нет под рукой общедоступного хостинга, чтобы я мог прямо вот так запустить проект и дать поиграться с ним не отходя от хабра, однако, я могу предложить вам видео (на vimeo), демонстирующее его основные возможности, что, думаю, тоже вполне ничего, а запустить проект вы сможете сами, благо подробные инструкции есть на сайте проекта, а развёрнутые пояснения и подробное описание работы (и руководство к расширению возможностей) — внутри…

Sametimed b0.1 Work Demonstration (HD) from Ulric Wilfred on Vimeo.

Установка
Для того, чтобы запустить этот клиент, нужно, по идее, четыре вещи:

Чуть более подробные инструкции как его запустить сам по себе или в виде рабочего проекта для 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.

fake

Я тоже обратил внимание и что могу вам сказать – ИМХО это фейк. Во-первых смутил домен http://www.google.com-wave.info/ Google никогда бы не зарегистрировали такой домен. Во-вторых сам сайт – просто одна страничка, на которой нам предлогают ввести свой твиттер аккаунт и электронную почту.

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

Будьте внимательны к сайтам такого рода!
Для подтверждения информации всегда обращайтесь к оффициальным источникам.

А инвайт на Google Wave скоро получат многие из вас! Не будем торопить события.

вторник, 6 октября 2009 г.

Google Wave на Android

Решил показать, как же выглядят волны на устройстве Android.

Google Wave на Android

Во-первых мы видим, что отображается корректно и понятно.

Google Wave на Android - Waves

После того, как мы перешли на сайт, то видим список волн.

Google Wave на Android - Contacts

Контакты в принципе тоже не отличются от PC\Mac версии

Google Wave на Android - In Wave

Внутри самой волны.

Google Wave на Android - in Wave 2

Навигация по волне.

Так как это тестировал не я, то немного не понятно – а где же у нас список папок, сохранёные поиски?

Так же минус – нет индикторов колличества новых сообщений. Когда мы внутри волны, мы ведь не можем скакать то к списку волн, то внутрь волны. Ноя думаю всё это подправят. Плюс к тому же ходят слухи, что начали разработку специализированного клиента под 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 для Волны

В одной из статей я описывал инсталляцию волнового демо-сервера 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-образных окон, а есть лишь пара-тройка волновых «змеек» в трее (их видно в правом нижнем углу скриншота).

Источник: Вадим Барсуков