Автор: vit

  • Как считается TIOBE индекс?

    Прочитал новость на слэшдоте о новых данных по TIOBE индексу языков программирования за Апрель 2010 года (оригинальную статью можно прочитать здесь):

    Position
    Apr 2010
    Position
    Apr 2009
    Delta in Position Programming Language Ratings
    Apr 2010
    Delta
    Apr 2009
    Status
    1 2 C 18.058% +2.59% A
    2 1 Java 18.051% -1.29% A
    3 3 C++ 9.707% -1.03% A
    4 4 PHP 9.662% -0.23% A

    В итоге, разница в индексе популярности языков программирования (по методике TIOBE) между С и Java составляет около 0.007, что на мой взгляд незначительно (по сравнению Java – PHP = 8.389)

    Индекс считается очень интересно. (далее…)

  • Стимуляторы

    Приготовление стимуляторов мозговой активности программиста в офисных условиях (кроме эспрессо)…

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

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

    /* NOTE: Все описанные в тексте  эффекты являются субъективными, эффект от их применения сугубо индивидуален. Проконсультируйтесь с врачом. */

    кунг-фу чайник
    кунг-фу чайник

    Тегуаньинь + Кунг-фу чайник.

    Зелёный чай, как мне кажется, является одним из самых мягких стимуляторов по воздействию на сознание, а тегуаньинь – один из лучших, и к сожалению один из самых дорогих.

    Очень хорошо принимать после выходных, когда требуется постепенная подготовка мозга к работе.  (далее…)

  • Учебное пособие по Scala. Вольный перевод.

    В связи с малым количеством (на момент публикации этого поста) полноценных учебных материалов по языку программирования Scala на русском языке , постарался сделать простой перевод краткого пособия.
    Оригинальная статья лежит здесь http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
    Корректура текста будет осуществляться после публикации, по ходу получения отзывов, комментариев и повторной вычитки. Возможно, через некоторое время выложу PDF-версию.

    Scala Tutorial.

    Авторы: Michel Schinz, Philipp Haller. Версия 1.3. 15 марта, 2009

    Учебное пособие по Scala. Вольный перевод.

    Автор перевода: Вит. 30 марта 2010.

    Введение

    Этот документ дает краткое представление по языку и компилятору Scala. Предполагается, что читатель уже имеет некоторый опыт в программировании и хочет получить представления о том, что он может делать с помощью Scala. Также предполагается, что читатель обладает базовыми знаниями в области объектно-ориентированного программирования, а если быть конкретным — на языке программирования Java.

    Первый пример

    В качестве первого пример мы возьмём стандартную программу Hello World. Возможно это не самый обворожительный примерчик, но зато он легко демонстрирует использование Scala и при этом не требует особых знаний самого языка.

    object HelloWorld {
        def main(args: Array[String]) {
            println("Hello, world!")
        }
    }
    

    Структура такой программы должна быть знакома Java-программистам. Она состоит из main-метода, который получает аргументы командной строки в виде массива строк в качестве параметров. Тело метода состоит из единственного метода println, в качестве аргумента которому передаётся «Hello, World!». Метод main ничего не возвращает, поэтому нет необходимости явно указывать тип возвращаемых данных.

    Java программиста может смутить в самом начале слово object в котором содержится main метод. (далее…)

  • Хранение семантических данных. Связка: 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.

    (далее…)

  • деревья и реляционные базы данных. вложенные множества.

    Для работы с древовидными (иерархическими) структурами в первую очередь следует постараться понять какие действия будут осуществляться часто, а какие эпизодически.

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

    1.  Узел хранит информацию о родителе. Это  классика.

    CREATE TREE_NODE (ID INT ..., PARENT_ID INT, ...);
    

    Все очень просто –  узел хранит идентификатор родительского узла. Самая простая схема.

    Такую схему удобно использовать когда:

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

    Другой вариант использования, когда в основном  требуются выборки на уровне одного поколения – получить список  “детей” у данного узла или получить информацию о родителе. Например, если мы используем асинхронное получение узлов в дереве.  Тогда дерево отображается не сразу, а после нажатия пользователем на соответствующий узел, после которого идет обращение к веб-серверу на получение данных. Например, как это выглядит в  Ext GWT (GXT).

    Кстати, в некоторых базах данных существует уже готовые механизмы для работы с деревьями. В частности в ORACLE это CONNECT BY.

    2. Вложенные множества.  Узел хранит в себе информацию о своем расположение в дереве.

    CREATE TREE_NODE (ID INT ...,  LEFT INT...,  RIGHT INT...) ;

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

    и следующего SQL запроса (получение всей ветки для C.1):

    SELECT id FROM tree WHERE left <= 5  AND right => 6 ORDER BY left; -- в итоге получим узлы A, B.2, C.1

    (далее…)

  • Сортировка за 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 – надежность. Вероятность безошибочного выполнения операций в определенный период времени в определенном окружении.