LXF86:Kamaelia
Lockal (обсуждение | вклад) м (восстановление кавычек в коде AWB) |
Yaleks (обсуждение | вклад) (→Часть 3. Запись ваших сессий: иллюстрация) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 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 – это просто специализированный клиент, и люди могут обсуждать то, что он «говорит». | ||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Часть 4. Научная основа Kamaelia === | === Часть 4. Научная основа Kamaelia === | ||
Строка 226: | Строка 221: | ||
Набор зависимостей довольно велик, но следует помнить, что они требуются только для поддержки дополнительных функций. Не нужен Dirac – не устанавливайте зависимости Dirac! | Набор зависимостей довольно велик, но следует помнить, что они требуются только для поддержки дополнительных функций. Не нужен Dirac – не устанавливайте зависимости Dirac! | ||
+ | |||
+ | [[Категория:Hardcore Linux]] | ||
+ | [[Категория:Майкл Спаркс]] |
Текущая версия на 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. Запись ваших сессий
Если вы прошли предыдущие шаги, то теперь можете использовать «блокнот» для совместной работы с друзьями и коллегами – вплоть до игры в крестики-нолики. Записанная партия этой игры, возможно, не выглядит волнующе; однако фиксация страниц из вашего плана мирового господства и всей сессии его подготовки может и пригодиться. Так что рассмотрим, как записать сессию; как воспроизвести сессию; как загрузить и сохранить страницы из произвольного места на диске; и, наконец, как добавить 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!