LXF86:Kamaelia
Aldebober (обсуждение | вклад) (→Клиент–сервер) |
Yaleks (обсуждение | вклад) (→Часть 3. Запись ваших сессий: иллюстрация) |
||
(не показаны 8 промежуточных версий 3 участников) | |||
Строка 72: | Строка 72: | ||
slide.1.png slide.2.png slide.3.png | slide.1.png slide.2.png slide.3.png | ||
− | + | ==== Скорая помощь ==== | |
Kamaelia спроектирована для упрощения поддержки параллельных программ (это реальная область для исследований!). | Kamaelia спроектирована для упрощения поддержки параллельных программ (это реальная область для исследований!). | ||
Старые Unixхакеры согласятся, что «граф-каналы» [graphline], подобно обычным [pipeline], заведомо способны ста | Старые Unixхакеры согласятся, что «граф-каналы» [graphline], подобно обычным [pipeline], заведомо способны ста | ||
ть полностью параллельными. | ть полностью параллельными. | ||
+ | |||
+ | === Часть 3. Запись ваших сессий === | ||
+ | [[Изображение:Img 86 64 1.png|450px|thumb|Что происходит, когда несколько «блокнотов» объединяются, формируя сеть.]] | ||
+ | Если вы прошли предыдущие шаги, то теперь можете использовать «блокнот» для совместной работы с друзьями и коллегами – вплоть до игры в крестики-нолики. Записанная партия этой игры, возможно, не выглядит волнующе; однако фиксация страниц из вашего плана мирового господства и всей сессии его подготовки может и пригодиться. Так что рассмотрим, как записать сессию; как воспроизвести сессию; как загрузить и сохранить страницы из произвольного места на диске; и, наконец, как добавить 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-серверу? | ||
+ | |||
+ | [[Изображение:Рис.2.jpg|thumb]] | ||
+ | |||
+ | Визуализатор: средство просмотра работающих систем изнутри. | ||
+ | |||
---- | ---- | ||
Строка 104: | Строка 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!