InterSystems Hackathon 2015

[Русская версия статьи изначально опубликована на Хабре здесь]

We have never arranged hackathon before, and none of us has even participated in such events. But if we bring ~50 of experienced COS developers to the same location for multi days training then why not try to apply their expertise for our good? Divide to teams, ask for ideas, and make them code some crazy projects in 1 day of hacking. [Well a little bit less than 1 day as we have found actually, but still idea is the same]

We are newbies in hackathon organization, so we asked for the external help – we have contacted Grigory Petrov (now technical evangelist of Voximplant, and former evangelist of Digital October center where he arranged several hackathon and similar events). He was willing to help, but we have discovered the harder way that he has to be in PyCon 2015 the same days we arrange Russian InterSystems School. Sigh. In any case, after long discussion with Grigory we have got clear understanding of all possible scenarios, of steps we need to proceed before hackathon, during, what to do, when and in which sequence. We were mentally ready for it.

InterSystems Fall School is usually 2-3 days long event. This year we were planning to start with almost 2 days of technical training and exercises (where most of training were doing various operations over the same dataset – database of posts). And after those 2 days participant supposed to be well prepared to use modern practices (using Angular for the client development, DeepSee and iKnow for analytics, and such).

At around of 17:00 of 2nd day we started hackathon: after brief introduction of rules and planned schedule, we started initial project teams assembly. The plan was  – get all possible ideas for projects from all relevant sources (i.e. our Russian University grants suggested projects, or suggested extension ideas to some already existing GitHub projects), start to discuss them and then choice project from the list, or any other relevant idea (which might be influenced by the list of suggested ideas).


If we review now all projects, which started, and categorize them by their sources, then we see that only small fraction were using topics of the suggested list. Most winners were developing their own idea.

Here is the list of projects at the start:

1.       Atom plugin; Suggested development of existing project
2.       CPM web site; Suggested development of existing project
3.       Geo-spatial indices Suggested but new
4.       Caché <> JS projection Brand new
5.       Arduino connect Suggested but new
6.       Call diagram Brand new
7.       B*-Tree map Brand new

We have proceeded a couple of intermediate stops where we have reviewed project advancement (i.e. at around 22:00 the 1st day, and at 11:00 the next day). And we stopped development at the 13:00 the 2nd day (due to logistics constraints), and not as if it would be spanning whole day hacking – the 17:00 the 2nd day. i.e. teams have only 20 hours for development, but apparently it was not a big deal for those who prepared well enough.

Each team had 5-10 minutes for presentation, and then ISC SEs decided which teams are winners. We have touch problem to choose – there were 4 brilliant works, each of them in other circumstances would be considered a winner. But we decided that Nikita Savchenko/Anton Gnibeda work this day was the best. Just because of astonishing development speed (only 1 day since the project inception) and the shown quality and achieved results.

hackathon-1 hackathon-2 hackathon-3

Here are more details about projects winners:

1st place

Nikita Svchenko and Anton Gnibeda are stars of our local community. They both participated in many outstanding projects, e.g

Although Nikita, Anton and Irina are all living in Kiev nowadays, but they usually not working on the same project at the same time, and this school was a rare chance for them to work together. But when they decided to form the team we (organizers) were tending to break a team and rebalance to others because other teams will be lacking of frontend skills we need elsewhere. However, at the end we decided to just see where this star team could go given opportunity and chance. [That was correct decision as we see today]

This project was not developing some precooked project as many other were doing. They have developed idea at the start of 2nd day of school, and then started coding immediately.

JavaScript Object Data Model — JavaScript object projection from Caché

Team: Nikita @ZitRos Savchenko, Anton @gnibeda Gnibeda, Irene @Gra-ach Mikhailova
GitHub repo:

There are 2 parts in this projects: server COS and client JavaScript. Server-side is simple REST data-points which allow get access to methods/properties of a classes. Client-side uses dirty JavaScript magic for extending client-side objects with the list of available server-side methods/properties. Which simplify debugging in the debugger


The beauty of this API design – it uses “proper”, modern paradigms in the JavaScript part, i.e. async calls and cascading where possible.

cjs.connector.connect("", "Samples", ["School2015"], function (cache) {
// creating a new object
 var p = new cache.School2015.Participant();
 p.Name = "Anton";
 p.Surname = "Gnibeda";
 p.$save(function(obj) {
   console.log("Participant with name " + + " saved!");
// executing instance method
 cache.School2015.Group.openById(1, function (group) {
   group.PrintInfo(function (res) {
// executing linq-like queries
   .where("Carma < 100 OR Carma > 140")
   .where("$id > 10")
   .exec(function(res) {

2nd place

As I already mentioned as a preparation step to hackathon we have formed a list of “interesting” task, which might be approached during hackathon. This was collected of Russian grants backlog and current GitHub projects backlog, with few additions of ideas from ISC employees.

And it was a good surprise for us when 1 of topics from grant backlog list was selected as a hackathon projects – geo indices.

Geospatial — spatial indices in Caché

Team: Andrey @Arechitsky Rechitsly, Alexander @adaptun Koblov, Alexander @Apogrebnikov Pogrebnikov
GitHub repo:

This was a long-staning request – we wanted that someone would implement support of geo spatial indices in Caché. There was no single reason why it could not be done eventually, given enough of expertise and opportunity. This hackathon was a good chance, because this team formed was overwhelmed with mathematics skills and COS expertise.

Thanks to this project now we have custom indices which internally use quad-trees for given set of geo pairs. Also authors have demonstrated simple Angular application, which visualizes quick search for the given box on map, and this search takes fractions of seconds even for the multiple millions in dataset.

In essence adding of such geospatial indices could be done this way:

  1. Add index for the pair of properties (longitude, latitude):
Index x1f on (Latitude,Longitude) As SpatialIndex.Index;
  1. Search for the given box of coordinates
 FROM SpatialIndex.Test
 WHERE %ID %FIND search_index(x1F,'window','minx=56,miny=56,maxx=57,maxy=57')
  1. Search for the given ellipse
 FROM SpatialIndex.Test
 WHERE  %ID %FIND search_index(x1F,'radius','x=55,y=55,radiusX=2,radiusY=2')
 and name %StartsWith 'Z'

This is only beginning of an implementation, obviously, and not in any case is pretending to be ISO 19125 compliant in this early development state. But that was an important 1st step, and is already usable in the COS projects

I am super excited about this particular project! It is not that polished as other winning projects, but could be influencing product in a long run…

3rd place

We decided to give 3rd place to 2 brilliant projects: call diagram visualizer and global map visualizer.

And worth to note that both these projects were directly influenced by Nikita Savchecnko’ UMLExplorer

Callsmap —call diagram visualization

Team: Oleg @doublefint Dmitrovich, Evgenia Litvin, Alexander @TsvetkovAV Tsvetokov
GitHub repo:

Oleg Dmitrovich liked how UMLExplorer visualized class hierarchy, and he wanted to extend it with call diagram functionality. They parse classes themselves, extracting method and function names, and then want to show call graph somehow. But unfortunately the components used in the UMLExplorer was not scalable enough to handle so many classes as Oleg had in their development namespaces (several thousand of classes, with the corresponding number of call edges). Thus he had to find another JavaScript component which could handle their situation and eventually they ended up using Viva Graph, which is very fast.

In some of their namespaces call diagram “galaxy” could be visualized this way:


Static picture does not show the whole beauty of a visualized diagram (which has nice animation effect in Viva Graph, in real life this graph animation is really astonishing)

CacheBlocksExplorer — global tree and database map visualizer

Team: Dmitry @daimor Maslennikov, Olga Kazantseva
GitHub repo:

Yet another project, which has been created on UMLExplorer engine — is that global tree, and database map visualizer created by Dmitry Maslennikov. Actually he had working globals b*-tree visualizer even before hackathon started (as a side effect of one question he has been asked at the Vladivostock training he delivered before). But once he showed his project at the start of hackathon the consensus was that we all want database map just like in old school “Norton SpeedDisk”. So Dmitry has implemented just exactly that map in 1 night.

global-tree disk-map

Now, as a side effect of this project development we have 2 very valuable tools, which might be useful both for education and for performance analysis.

It will be one of my favorite tools, I guess.

Other noticeable projects

There were 3 more projects which got to the final pitching stage in various conditions. Most of them are long-standing projects, and will be probably mentioned later, once some notable development would happened and went online. Not today

Here are their repositories in any case:

Atom COS Studio
Arduino Snippets


Now, several days after the hackathon completion we might derive cold hearty conclusions, and should admit that this hackathon experiment was more than successful, and produced 4 brilliant projects which will be of much help to community and to the product in a longer run.

Ain’t it cool?


Школа Инноваций 2015 – что такое хакатон?

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

Раз уж мы собираем в одном месте на несколько дней такое большое количество высококвалифицированных специалистов в разных областях платформы InterSystems, и раз уж мы традиционно заставляем работать слушателей в командах над разными заданиями, то почему бы не расширить такие практические упражнения и не сделать это тем, что сейчас привычно называют “хакатоном”?

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

Источник <>

У каждого из нас (надеюсь) есть несколько идей проектов, которые хорошо бы было когда-нибудь сделать, но никогда не доходили руки. И вот хакатон на школе будет таким шансом. У вас будет целых 24 часа (что равно 1440 минут) чтобы в команде с коллегами максимально продвинуться в любом из направлений. Не обязательно пытаться завершить проект за эти первые сутки активного развития, но опыт показывает, что при правильной концентрации и при достаточном количестве ресурсов, за первые сутки можно сделать максимальное количество ошибок, и вырулить на наиболее правильное направление развития, продвинувшись максимально далеко. Чем если бы вы делали самостоятельно и в свободное от работы время.

(Т.е. разброс сроков тут может быть такой: или два человека и сутки работы, или пару часов в течение полугода)

Real path to success


Как это будет происходить?

Перед началом хакатона, будущие лидеры команд выходят и за пару минут пытаются “продать” идею другим (есть такая идея, нужны программисты с такой-то экспертизой, и художники с такой экспертизой). Если идея привлекла и команда сформирована, то они начинают суточный марафон, если его идея не стрельнула, и никто не вызвался помогать, то есть несколько альтернатив: автор продолжает в одиночку, он присоединяется к какой другой достойной команде, или организаторы формируют команду волюнтаристcки. (В конце-концов, куда вы денетесь из пансионата за городом? ;) )

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

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

За пару часов до конца марафона, организаторы проводят тренировочную защиту проектов, и лидеры команд учатся правильно и быстро продавать текущий (или будущий) успех проекта. По завершении марафона все лидеры команд выступают перед аудиторией и организаторами и “за пару минут” выступления пытаются теперь уже всех убедить, что их проект самый полезный и крутой. По завершении докладов команд организаторы совещаются и выбирают победителей/распределяют призы. В настоящий момент предполагается что будут 3 приза от InterSystems, и один приз зрительских симпатий.

Какие темы проектов можно использовать?

Любые, в которых используются технологии платформы InterSystems (Caché, Ensemble, DeepSee, iKnow, whatever). Главным критерием в успехе хакатона всегда, всегда была хорошая идея (ну и правильные люди, собравшиеся в нужном месте). Мы открыты любой идее, если она релевантна InterSystems. Но даже если у вас нет ничего подходящего, у нас есть список тем, которые вы можете использовать для начала работ:

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


Персонально я бы обратил ваше внимание на запросы по расширению Atom-COS-Studio, CPM, или cache-map-reduce :)

Но вы, конечно же, вольны выбрать любую тему, даже не из названных списков. Главное, чтобы вам было интересно.

Масштабируемость Caché 2015 при использовании Ivy Bridge-EX

Недавно мы рассказывали о последнем релизе СУБД InterSystems Caché 2015.1, в котором существенно улучшена производительность, реализована поддержка второй версии языка преобразования XML-документов XSL Transformations (XSLT) Version 2.0 и использование семафоров для синхронизации процессов в Caché и организации их взаимодействия между собой. Кроме того, в новом релизе Caché расширены возможности использования сценариев высокой доступности и поддерживается применение внешнего web-сервера NGINX для сервера приложений Caché. В этой статье мы поговорим о первом из перечисленных усовершенствований нашей СУБД, а именно о том, насколько после выхода нового релиза улучшается производительность Caché при работе на многопроцессорных серверах, оборудованных процессорами Intel Xeon E7 v2 (кодовое название Ivy Bridge-EX).

Читать далее

InterSystems Caché и технологии NoSQL

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

Интернет проекты с высокой нагрузкой и приложения класса XTP (extreme transaction processing) изменили требования к технологиям СУБД. Приоритетными требованиями стали простота разработки, возможность специализации технологии хранимых данных для конкретного проекта, поддержка постоянного времени реакции системы при увеличении нагрузки, обеспечение низкой стоимости масштабирования и стоимости обработки больших объемов данных.

В качестве ответа на новые потребности возникло движение NoSQL – новый класс баз данных, который обещает разработчикам высокую скорость внесения изменений в приложения, низкие затраты на масштабирование и обработку/хранение больших объемов данных, высокую скорость работы на относительно недорогом железе – ценности, которые всегда были важны и для технологий компании InterSystems. Практически всегда NoSQL базы реализуют отличную от привычной парадигму работы приложений с базами данных – переход от концепции интегрирующей СУБД для нескольких приложений к концепции СУБД для одного приложения или одного проекта и больше – отдельной специфичной задачи в рамках проекта.
Читать далее

Индексация неатомарных атрибутов

Цитаты из википедии (1NF):

Каждое пересечение строки и столбца содержит ровно одно значение из соответствующего домена (и больше ничего).

Одно и то же значение может быть атомарным или неатомарным в зависимости от смысла этого значения. Например, значение «4286» является

  • атомарным, если его смысл — «пин-код кредитной карты» (при разбиении на части или переупорядочивании смысл теряется)
  • неатомарным, если его смысл — «набор цифр» (при разбиении на части или переупорядочивании смысл не теряется)

В данной статье будут рассмотрены стандартные способы ускорения SQL-запросов по следующим типам полей: строка, дата, простой список (в формате $LB), коллекции-cписки и коллекции-массивы.
Будет много SQL, немного классов и совсем чуть-чуть NoSQL

Bitmap-индексы в Caché на глобалах

В объектной СУБД Caché поддерживаются bitmap- и bitslice-индексы. Их очень просто использовать в классах Caché: достаточно в описании индекса указать признак Bitmap или Bitslice, и производительность некоторых SQL-запросов улучшается кардинально. Но как это работает?
В этой статье раскрывается, как устроены bitmap-индексы, как создать bitmap-индекс на произвольной структуре глобалов, как применять функции битовой логики и как эффективно их использовать при NoSQL работе в Caché.
Читать далее

Релиз СУБД Caché 2013.1

Вышла новая версия Caché 2013.1 Что нового?

Развитие функционала

  • дальнейшее развитие EXtreme Event Persistence;
  • поддержка WebSocket;
  • расширенная поддержка JSON;
  • новый редактор панелей в BI DeepSee.

Повышение скорости разработки

  • multiсompile классов;
  • новая команда COS return;
  • args по ссылке;
  • %Find для Caché SQL.

Улучшение производительности

  • производительность обработки XML +50%;
  • улучшение производительности de-journaling;
  • повышение производительности ROLLBACK до 20%;
  • увеличение лимита глобального буфера до 16 ТБ;
  • увеличение лимита разделяемой памяти до 1 ТБ;
  • построение индексов класса с минимальным временем простоя – %Library.IndexBuilder;
  • эскалация блокировок;
  • увеличение производительности конкурентных обновлений – до 30%.

Полная версия документа на английском языке.
Обо всем по порядку и о других изменениях версии под катом.
Читать далее

БД. Справочники. Примеры на MUMPS (Caché Object Script) 2

В прошлой статье мы рассмотрели пример справочника на MUMPS (Caché Object Script). Были разобраны структуры глобалов и метод retrieve. Мы научились простейшей операции – получению имени элемента по известному идентификатору. Рассматриваемые структуры были одноуровневыми. Опросы и комментарии, после статьи, показали, что тема в целом интересна. Сегодня рассмотрим примеры построения индексов для справочников. Все коды/идентификаторы/имена глобалов – настоящие. Основная идея данных статей – обмен знаниями/опытом разработки и проектирования живых баз данных.

Вкратце напомню основные моменты первой части:

  • cправочник это медленно меняющаяся информация;
  • retrieve – быстрая операция;
  • название элемента справочника меняется в одном месте;
  • Глобал имеет вид: ^ГлобальнаяПеременная(«индекс1»,«индекс2»,…,«индексN»)=«значение»

В примерах будут публиковаться полные версии команд. (write вместо w и т.д.)

Освежим в памяти имеющиеся глобалы с данными:



Глобал ^Dictionary – содержит все элементы справочников и их свойства, глобал ^NameDictionaryElement – содержит названия элементов справочников на всех языках.

Команда set – задаёт значение переменной (локальной или глобальной).

А теперь посмотрим как может быть устроен индекс справочника, и разберёмся для чего он нужен.
Читать далее

Оптимизация запросов в Intersystems Caché

В одной шутке говорилось, что есть только два способа оптимизации запросов: 1. добавить индексы 2. сменить СУБД. Посмотрим, что можно сделать в случае Intersystems Caché. В качестве примера возьмем результаты прошедшего конкурса SQL Performance Challenge. При подведении итогов, решения тройки лучших были представлены в виде планов запросов с краткими комментариями.

По условиям конкурса, для заданной схемы базы данных надо было оптимизировать 10 запросов.


Читать далее

Оптимизация приложений

Существует несколько причин, по которым Вы можете прийти к выводу о необходимости оптимизации разработанного приложения. Одна из них это значительное увеличение одновременно-работающих пользователей, а другая – неудовлетворительное время выполнения операций. Первое, что приходит в голову – может изменить настройки и все будет работать как надо, но не так много настроек в Cache’, чтобы изначально настроить сервер совсем не оптимальным способом. Вторая мысль – увеличить мощность сервера, но часто мы имеем желание увеличить производительность приложения на порядок, и замена сервера нам здесь скорее всего не поможет. Остается один выход – оптимизация приложений. Читать далее