Следующая программа показывает как может выглядеть обработчик зависимостей в Perl 6. Она демонстрирует использование пользовательских конструкторов, приватных и публичных атрибутов, методов, а также некоторые аспекты сигнатур. Кода в примере приведено не много, тем не менее он интересен и местами полезен.


    class Task { 
        has      &!callback;
        has Task @!dependencies;
        has Bool $.done;

        method new(&callback, Task *@dependencies)  {
            return self.bless(*, :&callback, :@dependencies);
        }

        method add-dependency(Task $dependency) {
            push @!dependencies, $dependency;
        }

        method perform() {
            unless $!done {
                .perform() for @!dependencies;
                &!callback();
                $!done = True;
            }
        }
    }

    my $eat =
        Task.new({ say 'eating dinner. NOM!' },
            Task.new({ say 'making dinner' },
                Task.new({ say 'buying food' },
                    Task.new({ say 'making some money' }),
                    Task.new({ say 'going to the store' })
                ),
                Task.new({ say 'cleaning kitchen' })
            )
        );

    $eat.perform();

Приступая к изучению классов

Perl 6, как и много других языков, использует ключевое слово class для определения нового класса. Следующий затем блок, как и любой другой блок, может содержать произвольный код, однако классы обычно содержат определения состояний и поведения.

Код примера содержит атрибуты (состояния), определяемые с помощью ключевого слова has, и поведения, определяемые с помощью method.

Определение класса создает объект-тип, который по умолчанию становиться доступным внутри текущего пакета ( аналогично переменным, определенным с помощью our ). Этот объект-тип является "пустым экземпляром" класса. С ними мы встречались в предыдущих главах. Например, каждый из типов Int и Str относятся к объектам-типам одного из встроенных в Perl 6 классов. Код примера в начале главы демонстрирует, как имя класса Task может использоваться в роли ссылки в дальнейшем, например для создания экземпляров класса вызывая метод new.

Объекты-типы не определены в том смысле, что они возвращают значение False если вызвать их метод .defined. Эту особенность можно использовать чтобы узнать является ли какой-либо объект объектом-типом или нет:


    my $obj = Int;
    if $obj.defined {
        say "Ordinary, defined object";
    } else {
        say "Type object";
    }

Далее ...

Эта статья входит в книгу "Все о Perl 6".

Perl 6 Pod is awesome markup language. I use the Pod as often as possible. For example, for creating presentations. How am I doing this?

I open my favirite text editor and start presentation with а DESCRIPTION:

=for DESCRIPTION :title('presentation template in Perl 6 Pod format') = :author('Aliaksanr Zahatski') :pubdate('2011')

The named blocks =Slide are used to describe each presentation screen:

=begin Slide :title('About me') http://search.cpan.org/$\sim$zag/ lang/rakudo ( FreeBSD ) Russian book "Everything about Perl 6" =end Slide

Lists are specified as a series of =item blocks :

=begin Slide :title('Content') key moments: =item features =item implementations =item usage =end Slide

A =Image block is used for insert pictures:

=for Image :width('3in') i/si26.jpg

The =config directive allows you to prespecify default images size:

=config Image :width('2in')

For specifying the code samples use standart Pod block with attribute lang:

=for code :lang('Perl') my @keys = <a b c d e>; my @vals = ^5; my %hash = @keys Z @vals;

or

=begin code :lang('JavaScript') var keys = ['a', 'b', 'c']; var values = [1, 2, 3]; var map = {}; //this is a comment for(var i in keys) { map[ keys[i] ] = values[i]; } =end code

would be rendered:

The following example demonstrates the use of pauses:

=begin Slide :title('Perl6::Pod::Slide: pause demo') Now : =Pause =for item :numbered Lists =for item :numbered :pause Tables =for item :numbered Headers =end Slide

Use =Latex to type Latex text;

=Latex \[ \Gamma_0 S_0 (1-\alpha)^2 = k_d \alpha^2 \quad \Rightarrow \quad \Bigl(\frac{1-\alpha}{\alpha}\Bigr)^2 = \frac{k_d}{\Gamma_0 S_0} \]

To insert a vector graphics I use coneverter epstopdf, and then insert it with =Image block.

Fork presentation template [1] designed for easy start and type "make" to build pdf file.

You will need the following software to be installed: latex-beamer, Perl 5 and Perl6-Pod-Slide [2].

NOTES

1. Presentation template in Perl 6 Pod format.https://github.com/zag/template-pod6

2. Perl6::Pod::Slide - make slides easy. http://search.cpan.org/perldoc?Perl6::Pod::Slide

Помимо материалов, публикуемых пользователем в сети, еще одним ресурсом является его сетевая активность. Она включает в себя следующие действия: изменение статуса, создание заметки, публикация фотографии или альбома, отметка понравившихся материалов других пользователей и т. д. Данная активность собранная с различных аккаунтов позволяет быть в курсе действий пользователя. Чтобы формализовать эту активность был создан формат ActivityStreams [1].

Участие в разработке спецификации ActivityStreams принимали участие представители известных компаний. На следующем снимке представлена одна из рабочих встреч, посвященная обсуждению этого формата [2]:

Данный формат основывается на следующих составных частях: автор (actor), действие (verb), объект (object) и цель (target).

Примеры активности, представлены ниже:

Сетевая активность
actorverbobjecttarget
Personsharedlinktarget
Personstarted followingPersontarget
Иван Васильевичменяетпрофессиюцарские палаты
Васяразместилфотографиюpicasaweb

Форматы представления сетевой активности могут быть следующие: JSON и Atom. В случае Atom возможна интеграция в уже существующий feed.

Вот простой пример записи в формате JSON, взятый из спецификации [3] :

{ "published": "2011-02-10T15:04:55Z", "actor": { "url": "http://example.org/martin", "objectType" : "person", "id": "tag:example.org,2011:martin", "image": { "url": "http://example.org/martin/image", "width": 250, "height": 250 }, "displayName": "Martin Smith" }, "verb": "post", "object" : { "url": "http://example.org/blog/2011/02/entry", "id": "tag:example.org,2011:abc123/xyz" }, "target" : { "url": "http://example.org/blog/", "objectType": "blog", "id": "tag:example.org,2011:abc123", "displayName": "Martin's Blog" } }

В следующем примере демонстрируется интеграция в формат Atom:

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:activity="http://activitystrea.ms/spec/1.0/"> <id>tag:photopanic.example.com,2009:activity/4859/4352</id> <title>Geraldine posted a Photo on PhotoPanic</title> <published>2009-11-02T15:29:00Z</published> <link rel="alternate" type="text/html" href="http://example.com/geraldine/activities/4352" /> <activity:verb>post</activity:verb> <activity:object> <id>tag:photopanic.example.com,2009:photo/4352</id> <title>My Cat</title> <published>2009-11-02T15:29:00Z</published> <link rel="alternate" type="text/html" href="http://example.com/geraldine/photos/4352" /> <activity:object-type>photo</activity:object-type> </activity:object> <content type="html"> &lt;p&gt;Geraldine posted a Photo on PhotoPanic&lt;/p&gt; &lt;img src="/geraldine/photos/4352.jpg"&gt; </content> </entry>

Определение пространства имен для формата ActivityStreams производится следующей строкой:

<entry xmlns:activity="http://activitystrea.ms/spec/1.0/" >

Формат AcvtivityStreams используется в распределенных социальных сетях, как формат передачи пользовательских событий. Так в протоколе Salmon, при создании пользователем комментария к статье на каком-либо ресурсе, производится идентификация автора и последующий импорт текста комментария или сообщения. Таким образом формат ActivityStreams вполне можно сопоставить с системой событий в операционной системе. Только вместо операционной системы - глобальная сеть Internet.

NOTES

1. Формат представления сетевой активности ActivityStreams. http://activitystrea.ms/

2. Встреча в офисе Six Apart, посвященная формату ActivityStreams. http://www.readwriteweb.com/archives/google_facebook_myspace_activitystreams.php

3. Спецификация JSON Activity Streams 1.0. http://activitystrea.ms/specs/json/1.0/

Формат Atom является во многих сервисах контейнером для дополнительной информации. Он представляет собой XML файл и содержит в структурированном виде информацию о ресурсе и его содержимом. Если в качестве ресурса выступает персональный блог, то Atom файл содержит информацию о самом блоге, а также содержимое и свойства каждой записи.

Простой пример Atom выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Example Feed</title> <link href="http://example.org/"/> <updated>2003-12-13T18:30:02Z</updated> <author> <name>John Doe</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id> <entry> <title>Atom-Powered Robots Run Amok</title> <link href="http://example.org/2003/12/13/atom03"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary> </entry> </feed>

В общем он схож с более простым форматом RSS, но появился Atom позже и является более современной заменой RSS.

Так как в основе формата синдикации Atom лежит XML, это позволяет ему быть контейнером дополнительной информации, сохраняя при этом соответствие своей спецификации. Расширение формата возможно с помощью пространства имен XML [1]. Следующий пример демонстрирует определение пространства имен и параметров протокола Salmon [2].

<link rel="hub" href="http://myhub.example.com/endpoint" />

На формате Atom базируется протокол публикации Atompub [3]. Этот стандарт унифицирует последовательность действий при публикации данных на ресурсе (например, Фотографий или заметок в блоге). При этом Atom является основным форматом для размещения информации.

NOTES

1. Namespaces in XML 1.0. http://www.w3.org/TR/REC-xml-names/

2. Salmon Protocol. http://www.salmon-protocol.org/

3. The Atom Publishing Protocol. http://tools.ietf.org/html/rfc5023

На минувшей конференции Lvee я выступил c двумя докладами:

  • Perl 6 Pod - формат ведения документации [1].
  • Открытые протоколы - основа распределенных социальных сетей [2].

Perl 6 Pod

Важный вывод, который я сделал по итогам этого доклада следующий: полезно знать уровень подготовки слушателей. Для этого достаточно задать пару ключевых вопросов. Как выяснилось, людей знакомых с форматом разметки POD и использующих Perl 5 присутствовало критически мало ( я заметил буквально 2 - 3 руки из присутствовавших человек двадцати). Поэтому основную часть доклада в основном рассказывал о архитектуре Rakudo и состоянии Perl 6 на данный момент. О формате разметки Perl 6 Pod рассказал поверхностно, в основном как его можно использовать. Анонсировал сервис создания книг writeat.com [3], использующий Perl 6 Pod в качестве основного формата.

Отмечу следующие моменты:

  • Какие web фрэймворки есть для Perl 6 ?

    Из известных мне, это Web.pm [4].

    Составить представление об готовности Perl 6 для решения прикладных задач можно на странице http://modules.perl6.org/. По указанному адресу располагается таблица актуальных модулей. Данный ресурс является отличным источником примеров кода Perl 6.

Открытые протоколы - основа распределенных социальных сетей

Тема сохранности персональных данных стала актуальной для меня после аварии в облачном сервисе Amazon [5] и нескольких фактах продажи социальных сервисов, которые я использую.

В поисках решения я пришел к выводу, что наиболее верным направлением является децентрализация социальной активности [6]. Доклад содержит краткие обзоры основных протоколов, используемых распределёнными сетями

  • Есть ли альтернативы веб браузру как средству ввода информации?

    Примером такой альтернативы является сеть OneSocialWeb [7]. В качестве транспорта в ней используется протокол XMPP, а в качестве инструмента отправки сообщений - Jabber клиент.

    Создать удобный для себя интерфейс очень просто. Например, записи в этом блоге публикуются с помощью Git [8].

  • Впечатления о Google+ ?

    Данным сервисом я еще не воспользовался ( c момента его анонса пребываю в состоянии постоянного движения и еще не добрался до полноценного инета ). Однако, на мой взгляд, Google+ является сервисом управления потоками социальной активности (как собственной, так и друзей). С лежащим в его основе форматом ActivitySteams уже были подобные эксперименты: manybots.com, cliqset.com.

На конференции неожиданно встретился доклад упоминавший тему распределенных социальных сетей с неожиданной стророны: Разработка PlugComputer'а и коробочка свободы (Иван Кутень, Minsk, Belarus). Он был посвящен plugcomputers - мини компьютерам, которые сопоставимы по размерам с небольшим блоком питания и могут служить в качестве персональных серверов в распределенных социальных сетях.

фотографии с lvee

NOTES

1. "Perl 6 Pod - формат ведения документации". http://www.slideshare.net/zagru/perl6pod-lvee

2. "Открытые протоколы - основа распределенных социальных сетей". http://www.slideshare.net/zagru/distributed-nets

3. Сервис создания и публикации электронных книг. http://writeat.com

4. A Perl 6 web framework. http://github.com/masak/web/

5. "Судный день для моих персональных данных".http://zag.ru/a4BR2

6. "Персональная публикация в Интернет".http://zag.ru/a4CJ1

7. Социальная сеть OneSocialWeb, построенная на основе протокола XMPP. http://onesocialweb.org/

8. "REST интерфейс и публикация с помощью Git". http://zag.ru/b48h1

Основным предназначением разметки Pod является создание качественной документации по программному коду Perl 6. Однако он отлично подходит, как впрочем и его предшественник POD, для создания любых документов, в том числе и для написания книг.

До недавнего времени первой и единственной (насколько мне известно) являлась книга "Все о Perl 6". Однако появились еще пару. Количество книг невелико и поэтому пока несложно рассказать о каждой из них.

"Все о Perl 6" [1]

Эта книга задумывалась и развивается как сборник материалов о языке Perl 6. Характерной ее особенностью является ее открытость как для читателей, так и для авторов. Проект создания этой книги ориентируется на совместную работу нескольких авторов.

"Создание Web приложений в WebDAO" [2]

Книга посвящена программной платформе WebDAO. Для меня она также является еще и техническим заданием для разработки. Особенностью этой книги является то, что исходные тексты книги находятся в дереве исходников объекта описания, т.е. в непосредственной близости к программному коду [3].

"Develop web applications in WebDAO" [4]

Перевод предидущей книги на английский. Одной из полезных свойств является тренировки навыков создания текстов на английском языке.

"Социальные API и протоколы" [5]

В данной книге собираются материалы полезные при разработке программ, использующих API популярных социальных сервисов. Книга расположена в репозитории git, рядом с статьями этого блога [6] . Это мне позволяет наполнять книгу материалами и вести блог одновременно.

Структура каталогов репозитория содержит катлог pub для опубликованных материалов, draft - для черновиков. После push новые статьи публикуются посредством REST запросов на сайте. Теперь среди каталогов появился book.

total 18 2 drwxr-xr-x 8 zag wheel 512 14 июн 18:22 . 2 drwxr-xr-x 6 zag wheel 1024 30 янв 15:09 .. 2 drwxr-xr-x 8 zag wheel 512 14 июн 14:38 .git 2 -rw-r--r-- 1 zag wheel 801 14 июн 18:21 README 2 drwxr-xr-x 2 zag wheel 512 31 окт 2010 bin 2 drwxr-xr-x 2 zag wheel 512 14 июн 17:58 book 2 drwxr-xr-x 5 zag wheel 512 14 июн 14:38 draft 2 drwxr-xr-x 5 zag wheel 512 12 июн 12:44 notes 2 drwxr-xr-x 10 zag wheel 512 2 июн 14:31 pub

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

=CHAPTER Социальный робот =head1 Два робота =Include ../pub/201101/26-robots/robots.pod (!NAME, !DESCRIPTION)

С помощью параметров директивы =Include я исключаю излишнюю секцию DESCRIPTION. Секцию NAME пропускаю, так как название главы книги может отличаться от названия поста в блоге.

В книге на данный момент содержится рецепт по созданию робота, помогающего мне в освещении конференции lvee.org. Как показывает практика [7], книга - лучший инструмент для систематизации информации. Такой путь кажется мне оптимальным и для проработки темы персональной публикации [8].

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

NOTES

1. Книга "Все о Perl 6". http://zag.ru/perl6-book/

2. Книга "WebDAO - платформа для создания web приложений". http://webdao.sourceforge.net/index.ru.html

3. Каталог с книгой по WebDAO на github. https://github.com/zag/webdao/tree/master/contrib

4. Книга "Develop web application in WebDAO". http://webdao.sourceforge.net/

5. Книга "Социальные API и протоколы". http://writeat.com/zag/social-book/

6. "REST интерфейс и публикация с помощью Git". http://zag.ru/b48h1

7. Статус книги "Все о Perl 6". http://zag.ru/a4Bo1

8. "Персональная публикация в Интернет". http://zag.ru/a4CJ1

По итогам моего опыта присутствия в социальных сетях у меня сформировалось стойкое убеждение, что не может быть среди них самой лучшей, самой безопасной или надежной . Даже если эти параметры близки к идеальным, проект является продуктом какой-либо компании, а та в свою очередь может изменить свою политику в отношении продукта, быть куплена другой компанией или даже может разориться [1].

После "судного дня" [2] у меня появилось стойкое желание вынести центр своей активности из внешних сервисов, сохранив при этом мое присутствие в них и активность.

Очевидное решение - децентрализация моей сетевой активности. В этом направлении существует достаточное количество проектов: Diaspora, SatusNet, Friendika, OneSocialWeb. Данные проекты относятся к группе децентрализованных социальных сетей. Почти все они открыты и некоторые можно использовать в качестве альтернативы коммерческим аналогам. Например, платформу микроблоггинга StatusNet можно установить на собственном сервере и домене.

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

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

Контроль над опубликованными материалами
Суть задачи заключается в том, чтобы изменения в исходном тексте или статусе моей записи (статьи, заметки) транслировались на остальные подключенные сети. К примеру, отличной функцией является возможность отмены публикации или удаления статьи.
Резервная копия персональных данных

Публикуя поток своей активности в разных сервисах я создаю "резервную копию" моей активности.

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

Взаимозаменяемость
В случае если один из социальных сервисов оказался в нерабочем состоянии, возможно продолжать писать сообщения в любой из оставшихся. После восстановления сервиса - вся моя активность будет туда экспортирована. Это подразумевает синхронизацию моей активности между сервисами.
Внимание к моему действию
Хочу знать какое число людей и кто отметил мое сообщение (например лайками, favorites, возможно bookmarked). Подобная информация будет периодически собираться и актуализироваться.
Агрегация комментариев
Значительное количество времени экономится, когда комментарии из различных ресурсов собраны в одном месте. Идеально конечно, отвечать на них тут же, без перехода на ресурс источник.
Сбор отмеченных сообщений
Агрегация собственных отмеченных данных (likes, favorites) и, возможно, дальнейшая их миграция в сервисы наподобие evernote, delicious.com.

Это основные мысли, определяющие направление разработки.

NOTES

1. "Персональные данные - современная Анна Каренина ?". http://zag.ru/a4BY1

2. "Судный день для моих персональных данных". http://zag.ru/a4BR2

По итогам доклада [1] на DevConf отмечу отдельные моменты:

POD - Plain Old Documentation.

Perl 6 Pod - просто Pod. Отличительным признаком является расширение .pod6 у файлов нового формата.

Не знаю в какой момент я стал использовать Perl вместо Plain при расшифровке POD, но где смог исправил эту опечатку.

Определение блоков кода

Блоки кода в Perl 6 Pod, как и в POD, могут быть отмечены с помощью отступов. Однако спецификация ограничивает подобный способ блоками =pod, =nested, =item, =code и семантическими блоками. Для остальных стандартных блоков текст может быть отформатирован с помощью отступов без преобразования в блоки кода.

Демонстрация расположена на странице "Определение блоков кода".

Абзацы в списках

Блоки =item могут быть представлены в разграниченном стиле, а именно с использованием специальных маркеров =begin и =end. Благодаря этой форме представления стало возможным использовать несколько абзацев в определении списка.

Например:

=begin item I<Элемент списка>   Этот текст является также частью списка перечисления. =end item

Это позволяет реализовать более наглядное представление текста, так как все абзацы имеют одинаковый отступ. Пример можно посмотреть на странице "Использование абзацев в элементах списков" на странице конвертера "Perl6 Pod to HTML".

На конференции были представлены в виде потоков некоторое количество языков. Наиболее интересные материалы почерпнул из докладов про Ruby. На PHP секции узнал про "обновляшки" на php.

NOTES

1. Доклад "Perl 6 Pod - современный формат ведения документации".http://devconf.ru/offers/34, презентация "Perl 6 Pod - современный формат ведения документации"

<<Раньше - Позже>>