JasperReports

JasperReports Server это web-приложение на java (spring, hibernate, axis), бегающее на tomcat сервере (по умолчанию - http://localhost:8080/jasperserver/ ) с postgres базой данных. Основная цель - бизнес аналитика, тоесть получение агрегированных данных для отчётности по продажам, пользователям, их поведению.

Screen Shot 2012-05-17 at 10.41.30.png Так выглядит UI серверного приложения Установка адаптера для mongo

Как альтернатива вы конечно можете всё написать сами, но готовое решение легче в обучении для далёких от программирования людей. Аналогичные продукты этой многомиллиардной индустрии - CrystalReportsPentahoWindwardSpagoBISASBiRT. Они часто ещё называются складами данных, поскольку у них нет тех требований в скорости ответа как у традиционных баз данных, в то же время они могут хватить петабайты данных за десятки лет, который в определённый момент надо проанализировать по новым правилам.

В качестве источников данных могут выступать:

  • любая база данных через JDBC адаптер
  • no-sql/масштабируемые хранилища - MongoDB, Redis, Neo4j, hadoop-hive, couchdb, cassandra..
  • веб-услуги через XML, JSON
  • файлы (xlsx, csv)
  • всевозможные продукты - SugarCRM, SAP, Jboss
Схема в виде звёздочки, взято с википедии

Как я уже сказал, используется postgres в качестве хранилища, а для гибкого анализа вместо обычных нормализованных схем с JOIN-ами, используется фактологическая схема в виде звезды, которая и хранит всю информацию. Понятно что по одной таблице такие запросы будут быстрей, да и данные особо то не меняются. Аналитики называют такой подход OLAP

iReport

Составление отчёта происходит на основе правил в XML файле (видимо так принято во всём java-мире). Файл это можно написать конечно и вручную, но лучше использовать поставляемый IDE - iReport, где уже есть заготовленные шаблоны.

Выбор источников в iReport Так выглядит выбор шаблона отчёта в iReport

Доклады можно делать периодически и высылать по почте. Вот так выглядит настройка дизайна отчёта в редакторе:

iReport составление отчёта с SQL

См. также:

Особенности мобильной версии сайта

Хаос мобильных устройств внутри социальных группСделал себе мобильную версию блога, просто потому что надо — даже на андроиде с умным форматированием текста (который изобрела Опера) читать сайт не оптимизированный под мобильники неудобно. Для разработчиков это значит два варианта — либо сделать css файл который будет переделывать некоторые вещи и прятать ненужные блоки, либо же использовать отдельные шаблоны и в лучшем случае использовать параметр в том же контроллере что и основное приложение.

Устройство определяется через параметр user-agent в заголовке запроса - это можно использовать дальше в бизнес логике, например через php функцию. Знание устройства может влиять на то какую функциональность стоит подгружать, но это вовсе не обязательно потому что ..

Twitter/Facebook-подобная постраничная навигация

Я вот уже больше месяца как делаю социальную сеть pling.ee, которая акцентируется на связи посредством мобильных телефонов (SMS/MMS) и позиционировании людей с их помощью. Достаточно перспективный проект (как твиттер на дрожжах) и популярный среди местной молодёжи тем что можно почти нахаляву общаться.

Но технически возникла небольшая получасовая техническая задачка с навигацией, и раз уж я давно не писал, то может вам тоже будет полезно. Дело в том что в поток сообщений показывается ajax-ом, подгружаясь по X-сообщений  за раз чистым html (для json просто пришлось бы больше писать). Задача - прятать кнопку "ещё" если сообщений больше нет. Очень просто, но как оказывается не всё так очевидно.

Twitter pagination.png Facebook pagination.png

Вот возможные решения (от худшего к лучшему)

  1. При первой загрузке страницы делать второй запрос и узнавать какой ID у последнего сообщения и потом детектить его показ с помощью js. Проблема в том что как правило SQL для запроса и так сложный, а тут надо его продублировать с изменением сортировки. Уже пахнет говнокодом.
  2. Если число подгружаемых результатов меньше ожидаемых X элементов на странице то сразу прятать кнопку. Конечно с вероятностью 1/X она всё-таки будет показываться, зато
  3. Сделать что-бы нажатие кнопки сразу показывало спрятанные закешированные результаты (и если их нет - то не показывать кнопку) + делать ajax-запрос и результаты прятать (а если их нет то тоже прятать кнопку). Тут много игры с js и к тому же подгружаются лишние данные (не факт что пользователь всегда нажимает на продолжение)
  4. Использовать SQL_CALC_FOUND_ROWS что-бы расчитать число всех элементов и если их меньше чем offset + число на странице, то просто отметить последний элемент css-классом и через javascript проверить и спрятать кнопку если класс присутсвует

Цифровая подпись документов в Эстонии с помощью DigiDocService

В Эстонии с 2000 года вступил в силу закон о цифровых подписях, которые стали юридически равноценны обычным рукописным. Вскоре была создана и техническая основа - компания SertifitseerimisKeskus (буквально - «центр сертификации») принадлежащая банкам и телекоммуникацонным операторам (а не государству, представляете себе!) и схема обмена данными по X.509 стандарту. Эта статья расчитана в большей мере на программистов.

Цифровая подпись?

Подпись как оказывается очень важна, а признаваемая государством - тем более. Снижаются затраты на распечатку и/или доставку счетов по оплате, договоров между работником и работодателем. Я уже не говорю про обычное подтверждение что документ прислан точно нужным человеком, а не хакером. Спасает положение то что у каждого гражданина Эстоини есть сертификат подписи, но его недостаточно. Проблема в том что одной подписи-закарючки в IT-мире недостаточно. Подпись в расширенном виде на самом деле включает в себя набор данные, в том числе не статичные.

test_signature.png

  1. Стороны подписывающие документ
  2. Собственно документ или его отпечаток (говорящий о неизменном состоянии со времени подписания)
  3. Свидетели (нотариус) и роль сторон
  4. Время, место

DigiDoc контейнер Контейнер всей этой информации решили сделать на XML и назвать .ddoc расширением и связать с онлайн-сервисом создания и подтверждения подписей — Digidoc. За основу берутся основные свойства эстонской ID-карточки - авторизация, подпись и шифрование и в результате имеем:

  • цифровая подпись файлов (DigiDoc клиент, портал или третья сторона через DigiDocService)
  • шифрование и дешифрование файлов (DigiDoc клиент)
  • подтверждение действительности (digidoccheck)
  • подпись электронной почты
  • подпись или авторизация с помощью мобильного телефона (Mobiil-ID)

Контейнер со времени создания претерпел некоторые изменения, сейчас есть версия 1.3 основана на стандарте XAdES-X-L расширенных электронных подписей.

Процесс создания подписи с DigiDocService

Теперь собственно о главном что может понадобится на любом сайте. Допустим вы продаёте рога и копыта и хотите всё юридически правильно оформить. По-старинке это было бы типичный checkbox мол «согласен с условиями». Теперь же можно получить юридически действительную подпись клиента под любым договором, распиской купли-продажи или договора предоставления услуги.

Основные отличия HTML5

Недавно вышел HTML5, и хотя я надеялся что де-факто стандартом станет XHTML2, видимо этому не судьба. Следование веб-стандартам впринципе дело самодисциплины — кто-то пишет как умеет, а для кого-то это средство подчеркнуть свой проффесионализм.

Тэги

Основным нововведением стало внесение давно ожидаемых новых элементов, благодаря которым содержание выглядит чуть более семантичным, хотя только разве что в блогах. Хитрые дизайнерские сайты с плавающими блоками видимо лучше делать на более общих div'ах

Структурные тэги Тэги содержания
  • header — понятное дело, шапка с логотипом, логином, навигацией..
  • nav — навигация.. как меню, так и «хлебные крошки»
  • footer — подвал с копирайтами, контактами
  • article — очевидно влияние блогосферы и rss
  • section — подраздел документа
  • aside — боковая панель (видимо с коментариями, самыми популярными статьями, тэгами и тп)
  • video и audio — как альтернатива flash-плеерам. Врядли заменит флеш из-за проблем с кодеками и отсутствии поддержки уже созданных .flv видео. Мало поддерживается пока браузерами.
  • progress — полоса завершённости процесса. Полезно при заполнении форм
  • time — полезно для указания точного времени элемента
  • details — просто дополнительная информация
  • datalist — нечто типа автозаполнения, но с прописанными вариантами

html5_structure.png