пятница, 2 ноября 2012 г.

Typed approach for object ids in Scala

Short example

Try to imagine that you are writing some application in Scala, use case classes to store your data, and something like Salat to automatically serialize your classes. Occasionly, you have two objects linked together:

At some point at time you need to add another link with another object:

Hey, now it compiles, but doesn't work! If you have tests, we can say you are in luck: you can run tests, try to fix broken line, run tests another time, try to fix other line... No fun at all. Or if you don't cover some method, you can have time bomb somewhere. Worst case ever!


Type system to the rescue!

What is type system? A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kind of values they compute. In other words, type system allows compiler to prove correct behavior of you program! So what is fun writing in language with powerful type system but don't use it powers?

At this point we already have some amount of code and tons of data, so we don't want to break serialization. Also, we don't want additional boxing for every id. What can we do here? Haskell, the Language of Types, already has a concept for this! It is called newtype. Using it, you can introduce new type on top of other, and have conversions from one to another, but without additional boxing -- values of source type and defined newtype will be represented identically in memory, so from one side you will not loose memory and cpu time for useless boxing, and Salat will serialize your data like it was old Keys!

And of course, this is in some Scala libraries for free! shapeless is one of them. Here goes an example: Using it, we can define type, representing object's id:

So our first example will become: And from this moment, we can change our definitions as we want, with compile-time check!

вторник, 3 апреля 2012 г.

Среда разработки экспертных систем CLIPS

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

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

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



CLIPS (Language Integrated Production System) – созданная в 1984-м году одной из лабораторий НАСА экспертная система, которая использует LISP-подобный язык для описания предметной области. Язык этой системы прекрасно подходит для описания любых логических связей, он оперирует следующими тремя понятиями:

  • факты (facts)
  • правила (rules)
  • объекты (objects).
Факты в данном случае – это дискретная единица информации, которой может оперировать система. Факты бывают двух видов: упорядоченные и неупорядоченные. Первые, как ясно из названия, представляют собой упорядоченные кортежи значений базовых типов – списков, чисел, строк, атомов и ссылок. Вторые представляют собой именованные пары ключ-значение и во многом похожи на struct из C без методов. Любой факт начинается с атома, который является именем факта:
(fact-without-fields)
(my-ordered-fact 1 2.0 "three" four)
(some-unordered-fact (username "Ha><0r") (description "script kiddie"))
Перед использованием, неупорядоченные факты необходимо определять. Такая же практика рекомендуется и для упорядоченных фактов, но их объявления могут быть "выведены" из использования. Факт определяется путем указания шаблона факта. Шаблон содержит как сами поля, так и различные метаданные на них, такие как тип и значение по умолчанию.
(deftemplate land-maximum-candidate
  (slot name (default ?NONE) (type STRING))
  (slot berry-of-choice (default ?NONE) (type STRING))
  (slot profit (default ?NONE) (type FLOAT))
  (slot checked (default FALSE) (type SYMBOL)))
Если тип или значение по умолчанию не указаны, то слот (slot – так называются поля факта) будет получать автоматическое значение NONE и принимать значение любого типа.

Над фактами можно оперировать с помощью правил. Правило имеет условия срабатывания и действия, так же называемые левой стороной (LHS) и правой стороной (RHS). Работа с условиями срабатывания CLIPS во многом похоже на сопоставление с образцом: LHS задает "шаблон внешних условий", представляющий из себя набор уточненных темплейтов фактов и предикатов. Пример правила:
(defrule bind-berry-land
  (land-coef (name ?name) (coef ?coef))
  (berry (name ?bname)
              (fruit-coef ?fcoef) (leaves-coef ?lcoef))
  => (assert (berry-land
               (name ?bname) (land-name ?name)
               (leaves-pollution (* ?fcoef ?coef))
               (fruit-pollution (* ?lcoef ?coef)))))
Данное правило срабатывает на всех комбинациях известных ягод и земельных участков, создавая новый факт о возможности посадки данного типа ягод на этом поле, содержащий в себе коэфициенты загрязнения листьев и плодов.

Объекты во многом похожи на факты – они так же имеют "имя шаблона" (имя класса) и слоты, и при этом полностью поддерживают парадигмы ООП – наследование, инкапсуляцию и полиморфизм. Объектно-ориентированный язык CLIPS (COOL) находится за рамками данной статьи и я предлагаю ознакомиться с ним отдельно.

Можно дать оценку CLIPS в двух словах: это интересно. С одной стороны, правила и факты образуют dataflow, что поднимает уровень абстракции и позволяет мыслить более декларативно, описывая только преобразования данных. CLIPS берет на себя управление порядком вычисления правил с помощью приоритетов, управляет зависимостями между фактами. С другой стороны, CLIPS очень легко встраивается в другие программы. В частности, можно посмотреть пример программы, интерфейс которой написан на PyQt4, а вся логика представлена в виде CLIPS-скрипта.

понедельник, 19 марта 2012 г.

GeoForm+ 2012

В прошлый вторник на военке вместо обычных занятий ходили на GeoForm+ 2012 – весьма неплохая альтернатива лекциям, так как вместо безликих ТТХ можно посмотреть и пощупать оборудование, и, если повезет, пообщаться с квалифицированными специалистами.

Выставка проходила с 13 по 15 марта в ЭЦ "Сокольники", и чтобы туда попасть необходимо было получить электронный билет (о чем многие узнали ночью перед выставкой).

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

С другой стороны был не менее пафосный стенд "СОВЗОНДа" – у них был самый большой на выставке сенсорный экран с демонстрацией web-гис. К сожалению, найти среди демонстраторов технически подкованного человека оказалось нелегкой задачей, и давно интересующий меня вопрос "почему векторные данные до сих пор отображаются в браузере отрендеренными изображениями вместо svg" остался без ответа.
Замыкала круг "теплых мест" небезызвестная Leica. К слову сказать, их приборы используются не только гражданскими фирмами, но и геоинформационной службой Германии.
Самое интересное, как водится, ждало внутри. В центре зала вполне заслуженно стоял мобильный лазерный сканер TopCon. Его отличительной чертой является то, что он позволяет проводить измерения прямо на ходу и сразу получать привязанные к местности облака точек.


Вообще, лазерные сканеры были представлены на выставке в большом количестве.


Меня, как человека которого в слове "геоинформатика" безусловно больше волнует вторая составляющая, интересовали детали софтверного характера. Так например не раз была предпринята попытка узнать, используют ли разработчики пакетов программ для лазерных сканеров вычисления на видеокарте, например OpenCL или CUDA. К счастью удалось отловить "своего человека" рядом со стендом RapidForm. По его словам, современные пакеты пока что используют для обработки собранной информации только силы CPU, но некоторые разработчики смогли приспособить память видеокарты в качестве кэша при работе с очень большими объемами данных.
Одним из самых необычных был стенд АФМ-сервиса. Ребята даже притащили с собой беспилотники:
Жалко, что не было МИИГАиК'овских Кречетов – думаю, они могли бы составить достойную конкуренцию.

И естественно, никакая геодезическая/картографическая выставка в России немыслема без вездесущей Панорамы:
Удалось потеребить их товарищей по поводу наболевшего у многих вопроса – когда же можно будет экспортировать сгенерированную из карты 3D-сцену? Увы, ответ как всегда один: "планируется", так же и как год назад, когда на одной из моих предыдущих работ нужен был этот функционал.

Но кроме российских фирм и их представительств на выставке были китайцы. Особенно порадовал вот этот защищенный переносной компьютер для полевой обработки геоданных:

И напоследок, немного оборудования для наблюдения за сейсмической активностью:

суббота, 7 января 2012 г.

VBox integration in GNS3 0.8.2b on MacOS X Lion

Blah-blah-blah
One of my most used pieces of Python software, GNS3 (GUI for Dynamips) is on the way to become much more cool. New beta version (0.8) gained VirtualBox integration. No more pain with Qemu patching and pure performance on OS X! But current version have one "small" issue -- VirtualBox integration is not working out of the box. I sacrificed several hours of my life to debug gods, but issue solved.

Solution
First of all: you do not need follow these instructions. Qt4, SIP and PyQt4 already included in DMG. Just download and drag'n'drop it in Applications folder.
Second: install latest Virtualbox (4.1+).
And finishing touch:


mv /Applications/GNS3.app/Contents/Resources/VBoxPython2_7.so /Applications/VirtualBox.app/Contents/MacOS/