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

LXF86:Kamaelia

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
м (категория)
(Часть 3. Запись ваших сессий: иллюстрация)
 
Строка 78: Строка 78:
  
 
=== Часть 3. Запись ваших сессий ===
 
=== Часть 3. Запись ваших сессий ===
 
+
[[Изображение:Img 86 64 1.png|450px|thumb|Что происходит, когда несколько «блокнотов» объединяются, формируя сеть.]]
 
Если вы прошли предыдущие шаги, то теперь можете использовать «блокнот» для совместной работы с друзьями и коллегами – вплоть до игры в крестики-нолики. Записанная партия этой игры, возможно, не выглядит волнующе; однако фиксация страниц из вашего плана мирового господства и всей сессии его подготовки может и пригодиться. Так что рассмотрим, как записать сессию; как воспроизвести сессию; как загрузить и сохранить страницы из произвольного места на диске; и, наконец, как добавить MP3 к работающей сессии (скажем, для транскрипции).  
 
Если вы прошли предыдущие шаги, то теперь можете использовать «блокнот» для совместной работы с друзьями и коллегами – вплоть до игры в крестики-нолики. Записанная партия этой игры, возможно, не выглядит волнующе; однако фиксация страниц из вашего плана мирового господства и всей сессии его подготовки может и пригодиться. Так что рассмотрим, как записать сессию; как воспроизвести сессию; как загрузить и сохранить страницы из произвольного места на диске; и, наконец, как добавить MP3 к работающей сессии (скажем, для транскрипции).  
  
Строка 111: Строка 111:
 
  ./MP3Player some_podcast.mp3 192.168.2.5 1500  
 
  ./MP3Player some_podcast.mp3 192.168.2.5 1500  
 
Как и другие программы, MP3Player – это просто специализированный клиент, и люди могут обсуждать то, что он «говорит».
 
Как и другие программы, MP3Player – это просто специализированный клиент, и люди могут обсуждать то, что он «говорит».
 
 
[[Рис.1:Example.jpg]]
 
 
Что происходит, когда несколько «блокнотов» объединяются, формируя сеть.
 
  
 
=== Часть 4. Научная основа Kamaelia ===
 
=== Часть 4. Научная основа Kamaelia ===

Текущая версия на 19:32, 7 января 2009

Содержание

[править] 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!

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