Wednesday, April 23, 2008

Статистика в блогах. Feedburner и Google Reader


Я хочу рассказать об интересных возможностях, которые может дать feedburner вашему блогу. Наверняка большинство блоггеров уже давно их оценили, но я все равно встречаю людей, которые им не пользуются, потому что: а) не знают про этот сервис; б) лень настроить; в) часто лень подкрепляется тем, что они не совсем понимают, что они получат в результате.

После бесплатной регистрации вы можете "зажечь" (зарегистрировать) свои feed'ы используя сервисы feedburner'а. Что это значит? Для каждого вашего feed'а feedburner сделает свой feed с аналогичным содержимым, но другим адресом. Именно под этим адресом вы должны публиковать свой feed, чтобы получить всю мощь статистики feedburner'а. У google есть список инструкций, составленный для многих популярных систем публикации, в которых содержится пошаговое описание того, что нужно сделать, чтобы быстро заменить старый адрес feed'а на новый (например, на blogger.com достаточно поменять всего одну настройку).

Что это дает? Возможность узнать:

  • Сколько у вас подписчиков
  • Какими RSS-читалками они пользуются
  • Количество просмотров для подкастеров
Но это далеко не все. Среди сервисов feedburner'а есть такой, который следит за web-посетителями вашего блога и считает:
  • Сколько их было
  • Из какого они города (география)
  • Каким браузером пользуются
  • На каком языке разговаривают (локализация браузера)
  • Какая у них операционная система и расширение экрана
  • Как посетители заходят на ваш блог
    • По прямой ссылке
    • Из поисковика, в этом случае видно строку поиска, по которой он нашел ваш блог
    • Либо с других сайтов с указанием ссылки
  • По каким ссылкам они щелкали на вашем блоге
Чтобы включить эту статистику нужно вставить в шаблон своего блога кусочек JavaScript, который предоставит feedburner.

Feedburner копит статистику в разрезе по дням и для каждого показателя может строить тренды. Таким образом вы можете посмотреть, какие посты были самыми популярными или узнать основные источники посетителей и т.д. Очень удобно для анализа посещаемости блога и открывает просторы для творчества при оптимизации контента.

Самую интересную на мой взгляд статистику я выделил жирным.

Особое внимание я хочу остановить на показателе "Какими RSS-читалками пользуются читатели". Средняя статистика по моему блогу показывает вот такую картину:

Как можно заметить - 71% читателей пользуются Google Reader'ом. Было бы интересно увидеть статистику других блоггеров, но мне кажется, что общая доля Google Reader'а будет >~ 50%.

Почему я заговорил про Google Reader, потому что недавно обнаружил, что Google Reader сам ведет статистику о feed'ах (нужно выбрать feed и нажать Show Details в панельке сверху).

Как видно эта статистика включает:
  • Среднее количество постов в неделю
  • Количество подписчиков
Я не знаю, как Google Reader получает эту статистику - либо анализируя свою базу, которую создают его подписчики, включая feed'ы к себе список (что наиболее вероятно), либо использует сервис feedburner'а (все помнят, что Google купила Feedburner?).

На основании этой информации можно вести рейтинги популярности разных блогов. Вот статистика по некоторым feed'ам, на которые я подписан (статистика от 23.04.2008):


Графа "Подписчики GoogleReader" - это то, что я вытащил из GoogleReader'а. И если учитывать, что эта RSS-читалка наиболее популярная, то на основании её можно сделать вывод об общем рейтинге feed'а, поэтому я не буду приводить общее количество подписчиков; чтобы представить себе это число - нужно умножить статистику GoogleReader'а как минимум на 1.5 (50%).

Следует отметить, что в этой статистике не учитываются web-посетители, а только RSS-подписчики. Полную статистику может дать feedburner. Так, например, официальная статистика Google Official Blog - это 476 тыс. читателей.


Кстати, эта картинка - также предоставляется сервисом feedburner и вы можете поставить себе на сайт такую же.

Надеюсь, что эта информация поможет сделать вам правильные выводы.

И еще очень хочется посмотреть, как будет выглядеть TOP 100 по этой версии. Поэтому если у вас есть feed'ы которые могут попасть в этот TOP (по числу подписчиков), то я был бы очень признателен, если бы вы оставили свои комментарии с информацией о статистике и ссылкой на feed и я обязательно включу их в этот список.

Обновление 25.04.2008

  1. Ни разу раньше не пользовался таблицами в постах. Оказывается blogger вставляет большие пробелы перед таблицами (по одному <br/> на каждый символ \n в формате кода таблицы). Чтобы от этого избавиться нужно таблицу обернуть в код:
    <style type="text/css">.nobrtable br { display: none }</style>
    <div class="nobrtable">

    Таблица здесь

    </div>


  2. Миша подсказал еще один feed, который на данный момент попадает на первое место - techcrunch.com

  3. Я решил добавить в таблицу статистику feedburner'а для тех фидов, где она доступна

Monday, April 21, 2008

Создание Java-расширений для OpenOffice.org

Продолжение здесь.

OpenOffice.org - это не только набор офисных программ, это еще и платформа для разработки приложений и расширений.

В этом посте я расскажу как создать простое расширение для OOo. Мое расширение будет вести журнал активности пользователя, а именно фиксировать когда и какие файлы были открыты, сохранены или распечатаны.

Хорошей отправной точкой для знакомства с программирование для OOo является книга OpenOffice.org 2.3 Developer's Guide (она же в PDF, 17 МБ), на основе которой я и сделал свою реализацию.

API SDK, которым мы будем пользоваться для создания нашего расширения, позволяет получить полный контроль (в том числе удаленно по сети) над офисными приложениями OOo. Достигается это за счет использования технологии компонентного программирования UNO (Universal Network Objects). На сегодняшний день API SDK доступно практически для всех языков программирования, включая Java, C++, CLI (C#, VB.NET), Python и других, включая встроенный скриптовый язык OOo Basic.

Мы будем пользоваться привязкой UNO к языку Java.

Для создания UNO компонентов разработчики OOo предлагают инструменты для интеграции с разными IDE, в частности, есть плагины для Eclipse и NetBeans. NetBeans я не смотрел, хотя в книге есть ссылки только на NetBeans, а вот для Eclipse плагин я посмотрел. Все, что он делает - это позволяет создавать простые компоненты, задействуя утилиты OOo для компиляции собственных IDL интерфейсов в java-классы.

В нашем случае эта возможность не потребуется - мы не будем создавать своих интерфейсов, вместо этого мы будем пользоваться готовыми интерфейсами SDK OOo, в частности com.sun.star.task.XAsyncJob, который позволит интегрировать в окружение OOo наш сервис, который подключится к шине обработчиков событий документов OOo.

Наше расширение мы будем создавать при помощи Maven2. Следует отметить, что у разработчиков OOo есть плагин для интеграции с Maven2 (maven-ooo-plugin), но:

  1. его нет в публичных репозиториях, а можно только скачать исходники из репозитория OOo и собрать плагин самому;
  2. он, также как и плагины для IDE, поддерживает только интеграцию с утилитами OOo, например, для компиляции IDL интерфейсов в java-классы;
  3. он все еще находится на стадии разработки и не поддерживает необходимые функции, например, сборку артефактов в готовый компонент *.oxt.
Вот, что у меня получилось в итоге (см. рисунок)

После запуска mvn clean verify на выходе мы получим готовую сборку расширения activity-monitor-service-1.0.oxt.

Файл oxt (OOo eXTension) представляет собой zip-архив со следующим содержимым:

activity-monitor-service-1.0.oxt \
META-INF \
manifest.xml
activity-monitor-service-1.0.jar \
META-INF \
MANIFEST.MF
org \ ...
description.xml
jobs.xcu

manifest.xml


Файл манифеста, который описывает содержимое этого oxt-архива. Здесь перечислены *.xcu и *.jar файлы.
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest>
<manifest:file-entry
manifest:full-path="${artifactId}-${version}.jar"
manifest:media-type="application/vnd.sun.star.uno-component;type=Java" />
<manifest:file-entry manifest:full-path="jobs.xcu"
manifest:media-type="application/vnd.sun.star.configuration-data" />
</manifest:manifest>

activity-monitor-service-1.0.jar


В этом jar'е находятся классы реализации нашего расширения.

У нас, класс, который реализует интерфейс com.sun.star.task.XAsyncJob (org.keyintegrity.ooo.ActivityMonitor), также является регистрационным классом, то есть в нем реализованы два статических метода - фабрика сервиса и регистратор сервиса. Для их реализации в SDK входит два класса-помощника (первый, второй). Так как это статические методы, то они не могут быть навязаны каким-то интерфейсом, про них нужно просто помнить. Интерфейс com.sun.star.lang.XServiceInfo предоставляет OOo информацию о сервисах, которые предоставляет данный компонент.

MANIFEST.MF


Стандартный манифест jar-файла, в котором содержится указание на регистрационный класс нашего сервиса.

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: dmitrygusev
Build-Jdk: 1.5.0_06
RegistrationClassName: org.keyintegrity.ooo.ActivityMonitor

description.xml


Файл описания нашего расширения. Такая информация, как версия расширения, версия OOo, для которого оно было разработано и др. хранится здесь.
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
xmlns:d="http://openoffice.org/extensions/description/2006"
xmlns:xlink="http://www.w3.org/1999/xlink">
<version value="${version}" />
<dependencies>
<OpenOffice.org-minimal-version value="2.4"
d:name="OpenOffice.org 2.4" />
</dependencies>
</description>

jobs.xcu


Конфигурационный файл, который регистрирует наш сервис, а именно подписывает его на события OnLoad, OnSaveDone, OnSaveAsDone и OnPrint. Сюда также можно включить конфигурационную информацию для сервиса - у нас это имя файла, где ведется журнал.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd">
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office"
xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node oor:name="Jobs">
<node oor:name="MonitorJob" oor:op="replace">
<prop oor:name="Service">
<value>org.keyintegrity.ooo.ActivityMonitor</value>
</prop>
<node oor:name="Arguments">
<prop oor:name="fileName" oor:type="xs:string"
oor:op="replace">
<value>c:/Temp/activity-monitor-service.log</value>
</prop>
</node>
</node>
</node>
<node oor:name="Events">
<node oor:name="OnLoad" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnSaveDone" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnSaveAsDone" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
<node oor:name="OnPrint" oor:op="fuse">
<node oor:name="JobList">
<node oor:name="MonitorJob" oor:op="replace" />
</node>
</node>
</node>
</oor:component-data>


Естественно, все не так просто, как кажется на первый раз. Если оставить в стороне сложности, связанные с разборками в API OOo (они хотя бы описаны в книге), то на первый фон выходит создание каркаса проекта для расширения OOo и его реализация с Maven2.

Во-первых, как оказалось для версии SDK 2.4.0 в открытых Maven2 репозиториях еще нет артефактов необходимых артефактов. Поэтому пришлось делать их самому. Здесь помог тот самый Eclipse плагин. При создании проектов с его помощью в CLASSPATH проекта вставляются ссылки на необходимые jar'ы. Как оказалось, они идут в поставке самого OOo (даже не SDK):

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="source"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="build"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/juh.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/jurt.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/officebean.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/ridl.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/unoil.jar"/>
<classpathentry kind="lib" path="C:/dev/bin/ooo-2.4/program/classes/unoloader.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

Именно из этих jar'ов я сделал артефакты и установил себе в локальный репозиторий.

В конце поста есть архив с готовыми артефактами; все что нужно - скопировать их себе в репозиторий.

Структура Maven2 проекта сделана таким образом, что все содержимое папки src/main/oxt будет скопировано в корень oxt-архива, который получается при сборке проекта. Эта папка является ресурсной папкой проекта и при сборке все содержимое фильтруется, так что в файлах конфигурации можно использовать выражения подстановки (например, ${version} в файле description.xml).

Я постарался сделать эту структуру как можно более универсальной, чтобы на ее основе каждый cмог сделать своё собственное расширение для OOo. Может быть кто-нибудь сделает из нее archetype?

Установка расширения в OOo


Чтобы установить расширение достаточно запустить *.oxt файл на выполнение (щелкнуть по нему два раза :), чтобы запустился Extension Manager OOo. Предварительно нужно закрыть все офисные приложения, иначе может быть поврежден реестр OOo.

Жмем OK и расширение установлено.

Примечание: Если устанавливать расширение повторно, то сначала нужно его удалить; в противном случае появится ошибка "Could not create java implementation loader". Правда, если попробовать еще раз - установка пройдет нормально.

Теперь можно проверить наш сервис в работе. Для этого откройте, сохраните или напечатайте какой-нибудь документ из любого приложения OOo. В файле журнала появятся записи, что-то вроде:

Mon Apr 21 00:19:35 MSD 2008 OnLoad file:///C:/Temp/ActivityMonitor.odt
Mon Apr 21 00:19:38 MSD 2008 OnSaveDone file:///C:/Temp/ActivityMonitor.odt
Mon Apr 21 00:19:45 MSD 2008 OnSaveAsDone file:///C:/Temp/ActivityMonitor-Modified.odt

Отладка расширения


Чему я всегда восхищался в отладчиках, так это возможности подключаться к любому процессу (локальному или удаленному). В Java это делается очень просто, благодаря JPDA.

При запуске OOo регистрирует все обработчики в своей шине событий на основании конфигурационных файлов (*.xcu). Когда очередное событие срабатывает оно идет по цепочке обработчиков и если очередной обработчик написан на Java, то OOo запускает JVM, в которую загружает этот обработчик.

Список виртуальных машин, доступных OOo, можно найти в меню Сервис | Параметры... ветка OpenOffice.org/Java.

Для того, чтобы к JVM можно было подключиться по JDWP нужно ее запускать с ключиками:

-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n


Эти ключики можно вписать в окошке Параметры... конкретной JRE.

После этого к нашему сервису можно подключаться, например, из Eclipse. Для этого нужно выбрать Run | Open Debug Dialog... Создать новую конфигурацию в ветке Remote Java Application (дважды на ней щелкнуть). Параметры по умолчанию вновь созданной конфигурации подойдут, если в параметры JVM вы добавили точно такие строчки, как я показал выше.

Если нажать Debug, то Eclipse подключится к работающему экземпляру JVM OOo. Можно поставить точки останова, где нужно и ждать, пока вызов дойдет до нужной точки.

Примечание: Если при нажатии Debug Eclipse скажет "Connection refused" это значит, что OOo еще не загрузил экземпляр JVM, потому что наш обработчик еще не был ни разу вызван.


Примечание: В путях к OOo и SDK не должно быть пробелов. Для этих целей я пользуюсь утилитой junction, чтобы создавать символьные ссылки. Например, для OOo я сделал такую ссылку:

junction.exe c:\dev\bin\ooo-2.4 "c:\Program Files\OpenOffice.org 2.4"

Примечание: Все "раскрашенные" исходники я сделал с помощью Eclipse-плагина java2html и GNU Source-Highlight.

Файлы для загрузки


Файл проекта (исходники + собранный файл *.oxt) (13 КБ)
Maven2 артефакты SDK OOo 2.4 (1.4 МБ)

Примечание: Чтобы установить артефакты себе в локальный Maven2 репозиторий нужно распаковать архив в папку <userdir>/.m2/repository.

Примечание: Чтобы собрать проект и получить oxt файл, нужно выполнить mvn clean verify.

Примечание: Чтобы загрузить исходники в Eclipse, нужно предварительно выполнить mvn eclipse:eclipse. Затем в Eclipse File | Import... | Existing projects into Workspace | Next > выбрать папку с проектом и нажать Finish.

Thursday, April 03, 2008

AnjLab.SyncIT - все задачи в Microsoft Outlook

... в продолжение предыдущего поста.

Ввиду специфики моей деятельности (учеба, преподавание, работа/программирование, open source :) у меня каждый день копится очень много текущих задач, которые я не успеваю сделать за один день, а завтра вообще могу о них забыть и вспомнить в самый неподходящий момент.

Самый лучший способ этого избежать - это записать их себе в Outlook в виде задач.


Помимо прочих, в отдельную группу можно вынести те задачи, которые мне назначаются в процессе работы над проектами. Это могут быть, например, тикеты (bug'и, новые задачи и т.п.) в Trac'е, или задачи в dotProject, на которые я назначен ответственным.

В среднем за день приходит по 2-3 таких задачи. У меня все проекты настроены так, что при добавлении/изменении/удалении задачи мне на почту приходят уведомления и, чтобы планировать их вместе с остальными задачами приходится добавлять их ручками в список текущих задач Outlook.

Здесь есть несколько проблем, которые сводятся к тому, что следить за задачами в разных системах и ручками записывать себе детали каждой задачи - мягко говоря, лень :) Ни для кого не секрет, что программисты ленивые люди и рутина их вводит в уныние.

Чтобы перебороть эту лень :), у нас с Юрой возникла идея сделать приложение, которое бы следило за всеми моими задачами и автоматически синхронизировало их со списком моих текущих задач в Outlook.

На самом деле, поводом для этих двух постов об Outlook как раз и стал выход первого официального публичного релиза AnjLab.SyncIT - Open Source проекта, над которым мы работали последние 2 недели и который позволяет решить описанные проблемы.

Изначально планировалась только поддержка Trac'а, потому что и мы в keyintegrity и Юра в AnjLab используем Trac для ведения своих проектов (отсюда, кстати, и начальное название проекта - outlooktrac).

Так как хостинг outlooktrac располагается на Google Code, то второй системой, которую мы решили поддержать стал Google Code.

Ну и, наконец, поддержку dotProject'а я включил потому, что мы используем ее в keyintegrity для поддержки наших внутренних процессов.

Скачать последнюю версию, включая исходники, можно со страницы проекта.

Так же, если у вас есть системы, для которых вы бы хотели добавить поддержку синхронизации с Outlook - можете оставлять свои запросы здесь.

Мой Outlook

В Outlook'е есть две вещи, которые мне нравятся и которыми я пользуюсь каждый день - это календарь и задачи. Да, я не пользуюсь почтой в Outlook, потому что Gmail пока никто еще не победил :)

В календаре я храню расписание своих университетских занятий (всегда забываю, когда числитель, а когда знаменатель), встречи по работе и личные дела - это очень удобно, сразу видишь, как мало у тебя свободного времени и начинаешь задумываться, как его лучше использовать :)

Кстати, к разговору о Gmail, у Google тоже есть календарь, но каких-то весомых преимуществ перед Outlook'ом я пока в нем не нахожу. Единственная польза, которую я из него извлек - это двухсторонняя синхронизация с Outlook'ом, благодаря которой я могу открыть свой календарь для Насти и подписаться на ее календарь, чтобы вместе планировать наше время.


Обычно, события, встречи и собрания в календаре задаются один раз и на пол года, и в течение этого времени практически не изменяются. Вся "текучка" - в задачах, о которых в следующем посте.