Журнал LinuxFormat - перейти на главную

LXF86:Kamaelia

Материал из Linuxformat
Версия от 19:32, 7 января 2009; Yaleks (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Содержание

Kamaelia: Работа по сети

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

Kamaelia – это открытый каркас общего назначения для разработки программ. Вы скажете: ну вот, еще один... Но Kamaelia имеет отличие: она работает с распределенными сетями в стиле BitTorrent для поддержки общего доступа к информации в децентрализованной [peer-to-peer] сети в режиме реального времени. Приложения, разрабатываемые с помощью Kamaelia, умеют мгновенно доставлять информацию, через LAN или интернет, потенциально неограниченному числу машин.

Эта технология возникла благодаря исследованиям BBC в сфере сетевой передачи мультимедийного контента, но стала применяться и в других областях. Она включает компоненты для работы с Freeview (свободное цифровое наземное телевидение в Великобритании) и инструменты обработки мультимедиа, и позволяет разработчикам легко и просто использовать Pygame, OpenGL, сетевые возможности, видеокодек Dirac, Vorbis, Speex и множество других инструментов в одной и той же системе.

Данный урок покажет, как пользоваться whiteboard-приложением, написанным для решения реальных проблем команды Kamaelia. [Whiteboard – приложение, позволяющее пользователям, объединенным сетью, рисовать на одной «доске». В русском языке встречаются термины «белая доска», «разделяемый блокнот», «разделяемая калька». Мы будем говорить «блокнот», – прим. перев.] Наша команда разбросана по разным местам и нуждается в системе совместной работы, поддерживающей и звук, и эскизы, и просто работы – а это может пригодиться многим открытым проектам. Некоторые из возможностей системы описаны во врезке «Что предлагает наш блокнот», справа. Интересно? Тогда займемся.

Часть 1. Установка ПО

Kamealia разработана для SUSE Linux, с использованием Python 2.4. Она должна работать под любым дистрибутивом Linux; но вашу конфигурацию мы вряд ли проверяли – обратная связь с командой разработчиков приветствуется (http://kamaelia.sourceforge.net/Contact.html). Kamaelia должна работать с любой версией Python, начиная с 2.2.2, но мы рекомендуем 2.4. Для установки Kamaelia требуются два основных пакета: ядро системы, называемое Axon; и библиотека компонентов и инструментов Kamaelia. После них устанавливайте любые дополнительные зависимости для желаемых специфических функций (примеры см. во врезке «Зависимости Kamaelia», справа). Для удобства я предполагаю, что вы выполняете установку как root. Кстати, вы можете считать Axon аналогом ядра Linux, а Kamaelia – базовой инсталляцией; все остальные файлы – необязательные дополнения.

Добавляем ингредиенты, по очереди

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

tar zxf Axon-1.5.1.tar.gz
cd Axon-1.5.1
python setup.py install

Kamaelia. Затем установим репозиторий компонентов. Распакуйте еще один архив, перейдите в каталог и запустите инсталлятор:

tar zxf Kamaelia-0.5.0.tar.gz
cd Kamaelia-0.5.0
python setup.py install

Pygame. Блокнот использует Pygame для отображения и ввода. Pygame может быть уже установлен у вас или включен в ваш дистрибутив. Если его нет, или ваша версия не последняя, установка выполняется легко: распакуйте, перейдите в каталог и запустите инсталлятор: tar zxf pygame-1.7.1release.tar.gz cd pygame-1.7.1release python setup.py install Вам будет задано несколько вопросов, зависящих от вашей локальной установки, вот почему предпочтительней использовать пакеты из вашего дистрибутива!

В этом уроке я остановился только на зависимостях для «блокнота»; но в MegaBundle полно других. Для более подробных инструкций по всем зависимостям загляните в отдельные пакеты или зайдите на http://kamaelia.sourceforge.net/GettingStarted.html. В Kamaelia существуют PVR-инструменты для захвата ТВ-сигнала и временного разделения. Если все прошло успешно, в вашей системе будет установленная Kamaelia. Если натолкнетесь на проблемы, проверьте, предоставляет ли ваш менеджер пакетов соответствующие версии ПО.

Поддержка мультимедиа

Speex. «Блокнот» использует аудиокодек Speex для эффективной передачи звука. Сперва установите Speex, затем – PySpeex, а затем – PyMedia. (Speex используется непосредственно для кодирования, PySpeex для активации компонентов Speex, а PyMedia – для ввода/вывода). Установка Speex вполне стандартна – распакуйте speex-1.0.5.tar.gz, перейдите в полученный каталог, введите ./configure, затем – make и make install. Теперь нужно установить поддержку Speex для Python, распаковав PySpeex-0.2.tar.gz, перейдя в него и выполнив python setup.py install. Распакуйте предоставляемую версию PyMedia с наложенными заплатками и установите, как было описано выше.

Python Image Library. Устанавливается так же, как Axon и Kamaelia: распаковать Imaging-1.1.5.tar.gz, перейти в полученный каталог и выполнить python setup.py install.

В этом уроке я остановился только на зависимостях для «блокнота»; но в MegaBundle полно других. Для более подро бных инструкций по всем зависимостям загляните в отдельные пакеты или зайдите на http://kamaelia.sourceforge.ne t/GettingStarted.html. В Kamaelia существуют PVR-инструменты для захвата ТВ-сигнала и временного разделения. Ес ли все прошло успешно, в вашей системе будет установленная Kamaelia. Если натолкнетесь на проблемы, проверьте, предоставляет ли ваш менеджер пакетов соответствующие версии ПО.

Часть 2. Использование «блокнота»

«Блокнот» предусматривает запуск из каталога установки. Однако можно переместить каталог «блокнота» в любое удобное для вас место вашей системы. Запустите приложение командами:

cd Kamaelia-0.5.0-rc1/Tools/Whiteboard/
./Whiteboard.py 

Если все завершилось нормально, вас встретит чистый экран и небольшая палитра цветов для рисования, а также ластик. Система будет захватывать звук, но поскольку мы запустили «блокнот» в автономном режиме (т.е. не в сети), он никуда не будет передаваться. Для начала, набросайте что-нибудь на первой странице. Для создания новых страниц, щелкайте на new page. Для перемещения назад и вперед между страницами, щелкайте на << и >>. Все, что вы пишете на страницах, сохраняется, т.е. можно вернуться назад и увидеть это, даже если вы поменяете страницы. Эта функция означает, что использование «блокнота», особенно на ноутбуках-планшетах или внешних планшетках (т.е. таких, которые вы можете прикупить в супермаркете!), совершенно интуитивно. Чтобы запустить whiteboard-приложение как сервер, добавьте номер обслуживаемого порта:

./Whiteboard.py --serveport=1500 

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

./Whiteboard.py --connectto=192.168.2.5:1500 

где 192.168.2.5 – IP-адрес сервера, а 1500 – номер порта. Если вы выполняете тестирование на локальной машине (localhost, он же – 127.0.0.1), имеет смысл сделать копию каталога «блокнота» перед запуском второго экземпляра:

cd Kamaelia-0.5/Tools
cp -R Whiteboard ClientWhiteboard
cd ClientWhiteboard
./Whiteboard.py --connectto=127.0.0.1:1500 

(Вы, понятно, можете создать копию каталога где захотите.) Смысл заключается в том, что при перемещении между отредактированными страницами изменения сохраняются, и два постоянно затирающих друг друга «блокнота» могут буквально взбесить! Теперь, имея два «блокнота», вы можете видеть, что все нарисованное на первом дублируется на втором. Если кто-нибудь создает новые страницы локально, эти страницы видимы только ему – у каждого есть свой собственный набор локальных страниц. Коллекция страниц не синхронизируется просто потому, что мы решили, что так удобнее: тогда не нужно проверять, что вы начинаете с одного и того же набора страниц перед соединением двух «блокнотов». Вы просто подключаетесь и начинаете взаимодействовать. С подключившимися друзьями можно еще и разговаривать. Качество звука сильно зависит от аудио-оборудования вашей машины и используемых микрофонов, так что стоит потратиться на внешний микрофон или гарнитуру. USB-микрофоны могут быть здесь особенно хороши. Если вы используете внешний микрофон, установите его как источник захвата по умолчанию в аудио-микшере вашей системы.

Клиент–сервер

Запуск «блокнота» как клиента и сервера – просто комбинация вышеприведенных опций: ./Whiteboard.py --serveport=1500 --connectto=192.168.2.5:1500 Тут «блокнот» становится настоящим узлом в терминах децентрализованной конфигурации. Однако понятия ячеистой [mesh] или древовидной [tree] конфигурации отсутствуют. Интересно было бы автоматизировать подключение к whiteboard-сети... Возникает очевидный вопрос: «Изображения сохраняются автоматически… а где?». А внутри подкаталога Scribbles, как стандартные PNG-файлы (поскольку PNG, благодаря сжатию без потерь, хорошо работает с изображениями, типичными для «блокнота»). На моей системе они находятся здесь:

cd Kamaelia-0.5.0/Tools/Whiteboard/
ls Scribbles
slide.1.png slide.2.png slide.3.png

Скорая помощь

Kamaelia спроектирована для упрощения поддержки параллельных программ (это реальная область для исследований!). Старые Unixхакеры согласятся, что «граф-каналы» [graphline], подобно обычным [pipeline], заведомо способны ста ть полностью параллельными.

Часть 3. Запись ваших сессий

(thumbnail)
Что происходит, когда несколько «блокнотов» объединяются, формируя сеть.

Если вы прошли предыдущие шаги, то теперь можете использовать «блокнот» для совместной работы с друзьями и коллегами – вплоть до игры в крестики-нолики. Записанная партия этой игры, возможно, не выглядит волнующе; однако фиксация страниц из вашего плана мирового господства и всей сессии его подготовки может и пригодиться. Так что рассмотрим, как записать сессию; как воспроизвести сессию; как загрузить и сохранить страницы из произвольного места на диске; и, наконец, как добавить MP3 к работающей сессии (скажем, для транскрипции).

Прежде всего, запустите whiteboard-сервер, набрав

./Whiteboard. py --serveport=1500. 

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

./WhiteboardRecorder.py whiteboard_session.rec 127.0.0.1 1500. 

Если whiteboard-сервер удаленный – в нашем случае, работающий на 192.168.2.5 – надо набрать

./WhiteboardRecorder.py whiteboard_session.rec 192.168.2.5 1500, и т.д. Для остановки записи просто нажмите Ctrl-C. 

Чтобы воспроизвести запись сессии, запустите сервер, набрав

./Whiteboard.py --serveport=1500. 

Затем, опять-таки, для случая c локальной машиной, примерно так же запустите инструмент воспроизведения:

./WhiteboardPlayer.py whiteboard_session.rec 127.0.0.1 1500 

либо, для удаленной машины,

./WhiteboardPlayer.py whiteboard_ session.rec 192.168.2.5 1500. 

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

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

>>> SAVE '/home/michaels/plans.png'
>>> SAVE '/home/michaels/plans.jpg' 

Аналогично, если сохраненное изображение уже есть, я могу загрузить его, заменив команду SAVE на LOAD:

>>> LOAD '/home/michaels/plans.png'
>>> LOAD '/home/michaels/plans.jpg' 

Если вы хотите воспроизводить MP3 во время сессии, вам понадобится запущенный whiteboard-сервер (скажем, 192.168.2.5 на порту 1500). Затем вы вводите:

./MP3Player some_podcast.mp3 192.168.2.5 1500 

Как и другие программы, MP3Player – это просто специализированный клиент, и люди могут обсуждать то, что он «говорит».

Часть 4. Научная основа Kamaelia

Kamaelia работает по принципу логического развития Unix-каналов [pipeline] на шаг вперед. Отличия заключаются в

том, что вместо прямых каналов вы можете создать произвольные фигуры (которые мы называем «граф-каналами» [gra

phline]). Любой объект Python можно послать по ребрам этого графа – в отличие от однонаправленной файлоподобной схемы передачи данных. Кроме того, наши компоненты используют хитрость Python, позволяющую системе оставаться однопоточной. При желании, можно использовать и многопоточную архитектуру, но, в отличие от каналов Unix, нам не требуются тяжеловесные процессы. Это, естественно, в итоге поощряет маленькие, узкофункциональные компоненты и повторное использование кода. У многих юниксоидов этот подход является второй натурой – маленькие фрагменты кода, решающие конкретные задачи и свободно объединяющиеся. Хитрость, которую мы используем в Python, называется генератором. Это маленький, упрощенный объект, похожий на подпрограмму; его можно также рассматривать как возобновляемую функцию. Лучше пояснить на примере:

>>> def fib():
...           a,b = 1,1
...           while 1:
...                      yield a
...                      a,b = b, a+b
...
>>> G = fib()
>>> G
<generator object at 0xb7b59bec>
>>> G.next(), G.next(), G.next(), G.next(), G.next()
(1, 1, 2, 3, 5)


Как видите, эта функция при вызове возвращает объект-генератор. Python делает это, поскольку в теле функции есть ключевое слово yield, позволяющее неоднократно вызывать метод next генератора – при этом в промежутках между вызовами система вольна использовать процессорное время по своему усмотрению. Затем поместим его внутрь класса с именем main. Это упрощает взаимодействие с функцией, добавление некоторых метаданных компонента, а в итоге – поддержку таких вещей, как визуальное составление систем с использованием графического компоновщика Compose. Простой компонент для вывода содержимого на экран может, например, выглядеть так: from Axon.Component import component

class ConsoleEchoer(component):
            def main(self):
                       while 1:
                                while self.dataReady('inbox'):
                                            data = self.recv('inbox')
                                            print data
                                yield 1


Этот код берет данные из inbox (похоже на чтение из stdin) и распечатывает их. С другой стороны, я упомянул, что у нас есть и многопоточные компоненты. Предположим, мы хотим написать компонент для чтения с консоли. Он может выглядеть примерно так:

from Axon.ThreadedComponent import threadedcomponent
class ConsoleReader(threadedcomponent):
            def main(self):
                       while 1:
                                data = raw_input('>>>')
                                self.send(data, 'outbox')


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

from Kamaelia.Chassis.Pipeline import Pipeline
Pipeline(
           ConsoleReader(),
           ConsoleEchoer(),
).run()


Функция button в Pygame работает примерно таким же целевым образом – она отрисовывает кнопку, и когда ее нажимают, отсылает сообщение. В качестве последнего примера мы создадим простой инструмент презентации, используя «граф-канал»:

Graphline(
            CHOOSER = Chooser(items = files),
            IMAGE = Image(size=(800,600), position=(8,48)),
            NEXT = Button(caption='Next', msg='NEXT', position=(72,8)),
            PREVIOUS = Button(caption='Previous', msg='PREV',
position=(8,8)),
            FIRST = Button(caption='First', msg='FIRST',
position=(256,8)),
            LAST = Button(caption='Last', msg='LAST', position=(320,8)),
            linkages = {
                         ('NEXT', 'outbox'):('CHOOSER', 'inbox'),
                         ('PREVIOUS', 'outbox'):('CHOOSER', 'inbox'),
                         ('FIRST', 'outbox'):('CHOOSER', 'inbox'),
                         ('LAST', 'outbox'):('CHOOSER', 'inbox'),
                         ('CHOOSER', 'outbox'):('IMAGE', 'inbox'),
            }
).run()


Этот код создает четыре кнопки: NEXT, PREVIOUS, FIRST и LAST, которые отсылают сообщение компоненту выбора (CHOOSER). Тот выбирает, какое имя файла отправить компоненту изображения (IMAGE). Затем компонент изображения загружает и отображает картинку.

Скорая помощь

На сайте Kamaelia в разделе Cookbook можно найти обширную библиотеку примеров. После завершения нашего урока, это лучший способ перейти на следующий этап освоения Kamaelia. http://kamaelia. sourceforge.net/ Cookbook.html.

И более того...

Написать «блокнот» с помощью Kamaelia оказалось намного быстрее, чем на C или C# –наша первая работающая версия была готова за пару дней. Каркас Kamaelia также позволяет сделать приложение намного более гибким, и поскольку оно строится поверх существующих сетевых инструментов, мы получили возможность сосредоточиться исключительно на самом приложении. Конечно, проблемы были, но они возникли бы в любом случае. Этот подход сделал их более явными и более простыми в устранении. Мы используем Kamaelia для исследования лучших способов доставлять контент BBC, и позволяем BBC работать умнее. Где еще вы могли бы создать PVR с OpenGL и подключить его к IRC-серверу?

Визуализатор: средство просмотра работающих систем изнутри.


Наш эксперт

Майкл Спаркс ведущий инженер BBC Research и лидер открытого проекта Kamaelia. Данный урок и интервью отражают его личное мнение как лидера проекта Kamaelia, а не мнение BBC относительно чего бы то ни было.

Что предлагает наш «блокнот»

  • Простейшие функции рисования.
  • Поддержка многостраничности с навигацией.
  • Каждый «блокнот» может быть клиентом, сервером или сразу и клиентом, и сервером. Если вы подключите свой «блокнот» к моему, а я изменю страницы, вы увидите эти изменения. Все, нарисованное в одном «блокноте», становится видимым на всех подключенных к нему. Поскольку любой «блокнот» может быть и сервером, и клиентом, он является децентрализованным в своей основе. Каждый подключившийся к любому серверу в сети сможет получить все, что предоставляется остальными.
  • Поддержка звука с использованием аудиокодека Speex (оптимизированного для разговора и для кодирования с очень низкой частотой дискретизации). То есть можно поговорить с любым из подключенных в данный момент.
  • Сессии могут быть записаны для последующего воспроизведения. Пока запись воспроизводится, вы можете использовать «блокнот» как обычно – как и все подключенные к вашей whiteboard-сети.
  • Поддержка MP3.
  • Консоль с командной строкой.
  • Экспериментальная возможность заставить «блокнот» нумеровать локально сохраненные страницы полусинхронным образом.

Зависимости Kamaelia

Kamalelia MegaBundle (http://snipurl.com/xie4) включает все основные зависимости. В ее недрах можно найти:

  • Обязательные файлы: Axon-1.5.1.tar.gz, Kamaelia-0.5.0.tar.gz.
  • Рекомендуемые файлы: pygame-1.7.1release. tar.gz, Pyrex-0.9.3.1.tar.gz.
  • Для поддержки звука в «блокноте»: speex1.0.5.tar.gz, pySpeex-0.2.tar.gz, pymedia-cvspatched.tar.gz.
  • Для загрузки и сохранения изображений: Imaging-1.1.5.tar.gz. Для BitTorrent: BitTorrent-4.20.8.tar.gz.
  • Для OpenGL: PyOpenGL-2.0.2.01.tar.gz. Поддержка Dirac: dirac-0.5.4.tar.gz.
  • Поддержка Vorbis (устанавливается в указанном порядке, в дополнение к Pyrex): libao0.8.6.tar.gz, libogg-1.3.3.tar.gz, libvorbis-1.1.2.tar. gz, pyao-0.82.tar.gz, vorbissimple-0.0.2.tar.gz.
  • Freeview (вам понадобится Pyrex и последнее ядро Linux): python-dvb3-0.0.4.tar.gz.

Набор зависимостей довольно велик, но следует помнить, что они требуются только для поддержки дополнительных функций. Не нужен Dirac – не устанавливайте зависимости Dirac!

Персональные инструменты
купить
подписаться
Яндекс.Метрика