Метка: Java

  • Хранение семантических данных. Связка: Jena / Jenabean + Sparql

    1. Jena

    В поисках средств для работы с семантическими данными (semantic web) на java можно наткнуться на  следующие решения:

    1. Jena
    2. JRDF
    3. Sesame

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

    • он позволяет работать с RDF, RDFS, OWL,
    • осуществлять запросы через  SPARQL,
    • есть возможность читать и писать из N3 и RDF-XML форматов,
    • работать с базами данными Oracle, MySQL, PostgreSQL, HSQLDB, MS SQL Server и Derby.

    Исторически, jena является разработкой выращенной в лаборатории Hewlett-Packard в рамках исследований по семантик вебу. Приблизительно с октября 2009 года HP-шники прекратили активные работы над этим проектом и стали его активно опенсорсить (под BSD-подобной лицензией).  Думаю сейчас  разработчики могут спокойно и бесплатно использовать  его без особых проблем.

    Для Jena имеется неплохой набор учебных материалов как на самом сайте, так и на других различных ресурсах (например на ibm-ком developerWorks: Introduction to Jena). Структура базовых классов простая и интуитивно понятная. Для примера, привожу краткий набор некоторых основных сущностей в библиотеке:

    • RDFNode – базовый интерфейс для ресурсов или литералов
    • Resource – RDF-ный ресурс (например <http://somewhere/JohnSmith>)
    • Literal – RDF литерал (“John Smith”)
    • Property – свойство или предикат (VCard.FN)
    • Statement – триплет “субъект” – “предикат” – “объект”
    • Model – множество триплетов

    Неплохую вводную по работе с Jena, можно прочитать на сайте  www.semantictools.ru. Также этом на сайте находится множество полезной информации для людей увлеченных семантическими технологиями.

    2. Jenabean

    Для связки между JavaBean и RDF хранилищем можно использовать библиотеку jenabean . Способ привязки базируется на аннотациях и чем-то напоминает работу с JPA — аннотациями даются указания каким образом связываются поля класса и данные в хранилище.

    Примеры, документацию и саму библиотеку можно скачать на официальной странице  проекта – http://code.google.com/p/jenabean

    Также там имеется замечательный скринкаст, в котором показано по шагам (с нуля) работа под NetBeans’e с этой библиотекой. Так что здесь какие-либо мои пояснения по установке и работе библиотеки уже не нужны, достаточно просмотреть видео на сайте.

    Далее хотелось уделить особое внимание работе  Jenabean и SPARQL.

    SPARQL – язык запроса для выгребания данных из RDF.  С его помощью можно осуществлять довольно хитрые выборки.

    Для работы через SPARQL в jenabean можно использовать класс Sparql, который может получать данные из Jena-вской модели (Model – множество триплетов) .

    Важно! В jenabean-овском  SPARQL-запросе обязательно должна быть переменная ?s, которая ссылается на требуемый вами объект. Зачем они решили сделать такую жесткую завязку  на ?s мне не понятно, может в следующих версиях придумают что-нибудь покрасивее.

    В качестве примере, можно рассмотреть кусок кода — получение списка из 10 (LIMIT 10) статей в порядке их публикации (ORDER BY ?d)  начиная с 20-ой (OFFSET 20) .

    String query = "SELECT ?s ?d WHERE " +
    "{ ?s a  . ?s  ?d } " +
    "ORDER BY ?d LIMIT 10 OFFSET 20";
    LinkedList
    list = Sparql.exec(model, Article.class, query);
  • GWT 2.0 + GXT (Ext GWT) + Maven

    1. GWT (Google Web Toolkit, произноситься: /’gwit/). На момент написания поста текущая версия  – 2.0.3.  Загрузить можно с официальной страницы GWT – http://code.google.com/intl/ru/webtoolkit/download.html.

    Вкратце механизм работы GWT можно описать так.  Исходный код пишется на Java, затем он транслируется в JavaScript,  в результате получаются несколько версий программ для разных браузеров (Firefox, IE, Safari, Google Chrome, Opera 9.0). Полученный JavaScript код неплохо оптимизирован – название переменных и методов сокращенны, убраны комментарии и лишние пробелы. В итоге получается его естественная обфускация.  (Пример кусочка полученного кода: function Y7(a){W7();LE(a);a.Vb=NOc;return a} ).

    После выхода версии  GWT 2.0 появилась возможность разбивать полученный JavaScript код (runAsync)  на отдельные файлы, которые затем загружаются асинхронно по мере надобности.  Так уменьшается размер первоначального скрипта и как следствие время загрузки и запуска приложения.

    Подробное описание есть на официальном сайте GWT.

    (далее…)

  • Сортировка за O(N)-время

    Случайно наткнулся на статью на java.dzone.comFast O(n) Integer Sorting Algorithm!

    Всегда считал что O(n*log(n) ) это очень хороший показатель.  Например, стандартная реализация сортировки в Java 6 является слегка модифицированным вариантом merge sort, которая  соответственно дает время n*log(n).  Получить ультра ускорялку сортировки можно используя дополнительные хитрости: используя дополнительные знания о самих объектах которые мы сортируем + ограничения на возможные их значения.

    Если верить википедии Гарольд Сьюард (Harold H. Seward) в 1954 году из MIT изобрел ультра крутой способ сортировки  – radix sort (поразрядная сортировка), а также разработал counting sort (сортировка подсчетом).
    При такой сортировки мы не используем Comparator, т.е. сравнение и перестановка элементов как в обычной сортировки не происходит. С другой стороны, такой метод требует дополнительной памяти и
    особо эффективен в тех случаях, когда мы сортируем большое количество натуральных чисел ограниченных по возможным принимаемым значениям. Например: массив из 1000000 целых чисел, которые принимают значения от 0 до 1000.
    (далее…)

  • шаблоны проектирования

    GoF Шаблоны проектирования

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

    Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес

    “Классикой жанра” считается книжка “банды четырех” (англ: “Gang Of Four” или просто GoF) – книга написанная Эрихом Гаммой и соавторами в 1995 году и посвященная шаблонам проектирования.

    Стивен Стелтинг, Олав Маассен. Применение шаблонов Java. Библиотека профессионала

    Из книг по шаблоном именно для Java-программистов читал “Применение шаблонов Java”.

    Описание шаблонов, которые я здесь привожу построено на следующем принципе.

    Название шаблона – ссылка на статью в википдеии. Пример – фрагмент java-кода, где  этот шаблон может встречаться в стандартном Java API или в каком-то “бытовом” случае.

    Для шаблонов, примеры которых я не смог найти место в стандартной реализации, приводиться просто его краткое описание. Другими словами там, где можно обойтись от использования “оригнальных” и “понятных” примеров ООП – CarFactory, Car, Ford или Fruit, Apple или Person, Student, Prepod и так далее, я старался использовать привычные для программиста StringBuilderMouseAdapter, Reader. Т.е. классы, объекты которых мы используем каждый день.

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

    Creational/Порождающий

    AbstractFactory

    // Создает DOM Document Builder в зависимости от используемого парсера
    DocumentBuilderFactory documentBuilderFactory = ...;
    documentBuilderFactory.newDocumentBuilder();
    

    (далее…)

  • UML. Диаграммы классов. Отношения

    Мини-справочник по обозначениям которые приняты в UML диаграммах классов для отношений между различными классами.

    Обозначаются стрелками.

    Отношения на уровне классов.

    Generalization. Наследование.


    Самое обычное наследование: class A extends B {    }

    Implementation. Имплементация.


    Реализация интерфейса: class A implements I {   }

    Отношения на уровне объектов

    Association. Ассоциация.


    Семейство отношения между объектами классов.  “Студент” – “Преподаватель”, “Покупатель” – “Продавец” и т.д.  Может обозначаться вообще без стрелки.
    Агрегация и Композиция  –  подтипы ассоциации.

    Aggregation. Агрегация.


    Подтип ассоциации. Например один класс содержит (агрегируют) объекты другого класса.

    Composition. Композиция.


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

    Просто отношение

    Dependency. Зависимость.

    диаграмма классов зависимость

    Классы “каким либо образом” зависят друг от друга. Например, если у одного класса меняются методы, конструкторы или поля, и поэтому приходится переписывать другой класс, то значит они зависимы.  Одна из самых слабеньких связей.  Например объекты одного класса передаются как параметр в методы другого класса и т.д.

    Полезные ссылки

    1. Cтатья на  wikipedia. Рекомендую прочитать также эту же статью на английской википедии.
    2. Официальный сайт UML. Спецификация и т.д.
    3. uml2.ru – в целом по UML
  • Нефункциональные требования к проектируемому ПО.

    Краткий справочник по  Non-functional Requirement.

    Перед разработкой архитектуры системы или на ранней стадии ее проектирования,
    всегда следует уделять внимание так называемым нефункциональным показателям (Non-functional QoS). Они определяют характеристики, которые не связаны с конкретным поведением системы, но при этом задают требования с точки зрения бизнеса.
    Как и для любых показателей, которые определяются на этапе проектирования, кроме  желаемых характеристик, следует также, в первую очередь, выявить их минимально допустимые значения. Например, если система будет доступна в рабочем состоянии меньше 100 часов в неделю (Availability = 100/168 ~ 59.52%), то такая система для бизнеса будет не интересна (убыточна, не приносить никакой пользы). Зачем это нужно?
    Дело в том, что далеко не все базы данных, сервера приложений или технологические платформы могут обеспечить необходимые показатели доступности (availability), масштабируемости, надежности и т.д.. Выбор тех или иных решений должен зависеть от этих характеристик.

    Краткий список нефункциональных показатели системы (Non-functional QoS):
    Scalabitlity – Масштабируемость. Возможность увеличивать производительность системы пропорционально выделенным ресурсам. Бывает горизонтальная и вертикальная. Вертикальная – докупаем более быструю память, более шустрый жесткий диск или переносим всё на один еще более мощный сервер. Горизонтальная – покупаем еще один сервер и запускаем приложения  в кластерном режиме, в случае необходимости – докупаем еще один сервер и втыкаем к двум уже работающим и так далее.
    Extensibility – Расширяемость. Возможность добавление дополнительного функционала.
    Flexibility – Гибкость. Возможность менять существующую архитектуру (например в зависимости от ценовой политики). В отличие от Extensibility, речь идет только об изменениях без дополнительного функционала. Например у заказчика нет денег на нормальную СУБД (допустим ORACLE). Наша задача сделать систему настолько гибкой, чтобы в случае необходимости мы смогли её подпилить так, чтобы она смогла  бы обойтись чем-нибудь бесплатным (MySQL или PostgreSQL).
    Насколько должна уметь прогибаться система, желательно, по мере возможности, определить по-раньше…
    Maintainablity – Поддерживаемость, ремонтопригодность. Способность поддерживать систему в работоспособном состоянии. Показатель определяет насколько легко (или сложно) вносить исправления в работающую систему, возможно ли повторное развертывание и запуск системы после сбоя, возможность восстановить из резервных хранилищ и т.д.
    Availability – коэффициент доступности(готовности). Процент времени проведенного  системой в работоспособном состоянии к общему времени работы системы.

    часто высоко доступные (High Availability) системы меряются девятками:

    • 99,9 % (три девятки) = система недоступна не более 8,76 часов/год
    • 99,99 %  (четыре девятки)= не более 52,6 минуты/год
    • 99,999 % (пять девяток) = не более 5,26 минуты/год

    Manageability – управляемость. Возможность отслеживать и предотвращать возможные сбои в системе. Это в первую очередь наличие логирование (журналирование), системы оповещения о сбоях, возможность предотвратить возникновения ошибки.
    Reliability – надежность. Вероятность безошибочного выполнения операций в определенный период времени в определенном окружении.

  • Вики-Тики-Тави… Небольшой обзор различных wiki-движков

    Всем добрый день!

    Переключаю режим протоколирования своих записей в WebLog-е ,в  режим DEBUG…
    Внимание! Количество публикуемой информации будет на два порядка больше.
    Изначально я планировал использовать этот блог в качестве замены блокноту.
    Очень часто в работе нужно записать на скорую руку различные советы, чтобы потом можно было их быстро найти и прочитать.

    В ближайшие несколько месяцев, планирую перейти на использование для этих целей онлайновых блокнотов. Сейчас выбираю между luminotes и ubernote(Google Notebook, к сожалению, сдулся…)
    Пока не выбрал буду использовать этот блог в двух вариантах – как для написания полноценных обзоров, так и для небольших заметок “чтоб не забыть” .

    Полноценные обзоры (инструкции), всё-таки оказались нужны, т.к. накапливается множество информации, которую хранить в виде небольших записок уже не получается.
    В данном топике попробую рассмотреть вики-движки: MediaWiki, JAMWiki, XWiki и MoinMoin.
    Начнем с двух главных аспектов:

    1. Какая от них польза?
    2. Какие они бывают?

    Польза
    Создание базы знаний  различных сообществ, рабочих групп и организаций. В целом, я вижу два основных UseCase’a использования Wiki.
    Case 1. Организация и ее внутренний рабочий беспорядок.
    Контекст
    Допустим существует компания (например кол-во сотрудников > 5 чел). Раз в два-три месяца в компанию приходят или уходят новые сотрудники. Деятельность компании лежит в технологически ёмких областях – IT, телеком и т.д.
    Проблема
    В компании существует огромное количество различных правил и инструкций,  которые либо никак не задокументированы, либо отражены в бумажном виде и покрыты толстым слоем пыли.  Периодически сотрудником приходиться проводить целое детективное расследование, чтобы понять  как собрать версию XXX для ООО “ГАЗМЯСБЫТ, где находится волшебный скрипт перезапускающий сервер или когда поздравить с днем рождению Машу из отдела продаж.

    Польза от wiki

    1. Не нужно держать в голове всю справочную информацию (настройки роутеров, дни  рождения сотрудников, “хитрые” правила сборки и выкладки программных продуктов, телефоны, адреса и т.д.)
    2. Делает информацию открытой внутри компании. Таким образом аннигилируются зависимость от “человека знания“, который единственный в радиусе 1 светового года знает, что где лежит и как это работает.
    3. Это просто интересно и модно. Некоторым это важно.

    Case 2. Фан-клуб, радио кружок, небольшой городок.
    (далее…)

  • JAD

    Используем JAD (JAva Decompiler)
    Очень удобно использовать в связки с FAR

    1. Качаем JAD http://web.archive.org/web/20080214075546/http://www.kpdus.com/jad.html
    2. Устанавливаем, т.е. тупо разархивируем
    3. Прописываем в PATH (если нужно)
    4. Запускаем FAR
    5. Нажимаем F9
    6. Открываем Комманды –> Ассоциации Файлов
    7. Жмем “Ins”
    8. Добавляем. Маска файла – *.class, команда для редактирования – edit:<jad -p !.!

    Все ОК.

  • jsecurity

    Разобрался с jsecurity (который сейчас Апач Ки – apache ki)

    документация слабая.
    Лучше делать так:

    1. Смотреть исходники, запустить под дебагом и вкуривать
    2. Просмотреть что написано здесь
  • Парсер для SWIFT’а

    Для разбора SWIFT сообщений можно использовать opensource реализацию WIFE