Рубрики
1. Языки программирования Scala

Учебное пособие по 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 метод.

Рубрики
2. Теория программирования 3. Инструментарий

Хранение семантических данных. Связка: 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 <http: //programador.ru/Article> . ?s </http:><http: //programador.ru/postDate> ?d } " +
"ORDER BY ?d LIMIT 10 OFFSET 20";
LinkedList<article> list = Sparql.exec(model, Article.class, query);
</article></http:>
Рубрики
3. Инструментарий

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.

Рубрики
2. Теория программирования

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

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

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

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
Рубрики
0. Мироощущение и бытие

программеры

Хочу поделиться своими мыслями на тему "Стоит ли становиться программистом".

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

Итак, объектом исследования будут являться "компьютерщики", "IT-шники" и прочая "живность" около компьютерного мира.

Для построения модели  создаем проекцию классов, используемых в популярных компьютерных RPG-играх, на "реально" существующий мир компьютерщиков.  Я не являюсь специалистом и поклонником различных компьютерных RPG игр.  Просто на мой взгляд, создатели этих игр и их миров, достаточно хорошо сумели обобщить и создать структуру всевозможных "типичных" героических персонажей.  Так что я нагло воспользуюсь некоторыми результатами их многолетнего труда по созданию и описанию чара.

Итак попробуем сформировать модель, как упрощенный объект, описывающий реально существующие группы субъектов.

Программер, программист, разработчик программного обеспечения  -  магmage. Конечно же это всего лишь аналогия, но, как мне кажется, наиболее близкая. Программисту нужен хороший интеллект (intelligence).  Он определяет, например, сколько языков может выучить программист, насколько сложные "заклинания-технологии" он сможет осилить.   "Программерская магия" бывает разная. Например, это может быть "стихия" windows или unix,  это могут быть различные языки на которых можно творить - c, java, c#, php, asm и т.д.  Сила программера - это долгое и упорное обучение.  Начинать за программера сложно, если интеллектуальные способности средние и нет возможности устроиться в отряд/группу к сильным программистам чтобы набраться экспы. Тогда придется браться за любые задачи, за которые платят хоть какие-то деньги. Многие в это время бросают проходить дальше за программера и начинают идти за другие классы.

Устроиться на работу сложно, ведь  мало кому нужен программист, который еще ничего не умеет делать, а на обучение которого уходят огромные силы и деньги.  Как вариант, можно "продаться в рабство" в компанию-донор, которая занимается выращиванием программистов для себя. Так в общем-то многие и поступают, ведь есть определенный шанс получить неплохой опыт и как результат достичь высокого уровня. В некоторых компаниях даже помогают получать "магические артефакты" - профессиональные сертификаты и прочие полезные предметы, которые остаются у программера и  иногда могут дать плюс к зарплате или получить интересную работу.

Рубрики
2. Теория программирования Java

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

Случайно наткнулся на статью на java.dzone.com - Fast 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.

Рубрики
2. Теория программирования Шаблоны проектирования

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

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. Диаграммы классов. Отношения

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

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

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

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


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

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


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

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

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


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

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


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

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


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

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

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

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

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

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

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