пятница, 9 сентября 2011 г.

Akka actors: Первое неоднозначное впечатление

Давно я ничего не писал, хотя в draft лежит много чего, в том числе интересного. Но эта статья носит немного другой, как мне кажется, не технический, а больше эмоциональный характер, поэтому решил её долго не пилить и выложить, тем более в twitter обещал отписаться о моём опыте.

Ситуация такая. Есть у нас маленький, как считалось не слишком важный, кусочек кода, который переносит данные из oracle в mongo с небольшими преобразованиями. Через некоторое время, как обычно, оказалось, что он не такой уж и неважный, поэтому возникла задач быстро его немножко ускорить. Особо оптимизировать в коде нечего было, поэтому ускорение можно было предать параллелизацией некоторых его частей, благо код был разделен на достаточно независимые части. Для этого я решил в порядке эксперимента воспользоваться интересно библиотекой Akka, написанной на Scala, но разработчики поддерживают удобное api и документацию и для Java. Это мой первый опыт с данной библиотекой, так что никаких откровений тут не будет, да и в целом, как я ранее написал, статья больше эмоциональная, нежели техническая.

суббота, 28 мая 2011 г.

JQuery: Slider + Table или я в роли доктора Франкенштейна

Для тех, кто меня не очень хорошо знает, этот пост может показаться несколько бессмысленным (слишком он в духе К.О.), поэтому объясню. Уже пару лет я занимаюсь по большей части backend приложениями (как в рабочее, так и в свободное время). Тут предоставилась возможность поработать над прототипом с web интерфейсом. Вот и хотел поделится своими ощущениями, что сейчас это уже выглядит не так страшно, вроде бы.

Стоит задача сделать что-то похожее на Google Finance StockScreener. В первом приближении необходима приятная табличка (с сортировкой и разбитием на страницы) и слайдер, с помощью которого можно отфильтровать данные, отображаемые в этой таблице. Слайдер уже есть практически из коробки: JQuery UI Slider. В качестве таблицы выбор пал на Data Tables. Осталось только их соединить так сказать вместе и об этом и будет этот небольшой пост.

суббота, 14 мая 2011 г.

Мир вверх тормашками или код как данные

Я тут в очередной раз пытаюсь перечитать (но уже печатную) SICP. Вторая глава там: Построение абстракций с помощью данных. Действительно, чтобы мы делали, если бы нельзя было из примитивных типов строить что-то побольше. И мне там очень понравился один примерчик. Про его и хочу рассказать. Если выключить машину времени и вернуться в реальность без скобочек, то в мейнстримных сейчас в наших палестинах C#/Java обычно для этих целей мы используем классы. Книжный пример рассказывал о паре. В C# для этих целей есть класс Tuple (там правда не только пара, но нам сойдёт). Так вот, а давайте представим, что в C# не было бы специальной конструкции языка class (ну и struct заодно). Как же теперь нам сделать пару или любую другую сложную структуру данных из примитивов языка? Я уже в статье раньше рассуждал немного о философской проблеме ООП языков: кто должен быть this'ом. Так вот под катом пример на C# (переделанный из SICP) демонстрирующий ненужность this :)

среда, 20 апреля 2011 г.

JLine: Интерактивная Java Console в стиле Quake

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

  • История команд, по которой можно легко перемещаться с помощью стрелочек.
  • Редактирование строки. В стандартном java console приложении невозможно отредактировать символ внутри уже набранной строки, приходится удалять весь хвост.
  • Автодополнение команд с помощью tab. Легко настраиваемое, но при этом с хорошим стандартным набором

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

суббота, 26 марта 2011 г.

Субботний вечер пропаганды маргинальных технологий: Статистический анализ с помощью clojure и incanter

Начну из далека. Все прекрасно знают, что Java код компилируется в платформа независимый java bytecode. Sun'ики этого не планировали, но, так же как и для CLR, появились альтернативные языки, компилируемые под JVM. Зачастую это порты других известных языков: Jython (Python), JRuby (Ruby), Kawa (Scheme). Они пользуются небольшой популярностью по очевидной причине, люди предпочитают использовать не порт, а настоящий язык. Но есть языки разработанные специально для JVM. Например Groovy, солянка Ruby и Java, заполучил своё место под солнцем как скриптовый язык, часто используется, как основа более гибких конфигураций, нежели статический xml и вроде веб на нём тоже делают. Ещё есть Scala, мельтипарадигменный язык, который совмещает в себе огромную кучу фич из ООП и ФП. Мне он не очень нравится перегруженностью синтаксиса, но он набирает популярность как замена Java. Но сегодня я хотел бы поговорить о Clojure - это функциональный язык, диалект великого Lisp'а. Ах, нет, я хотел обмануть, про замечательный язык clojure я не стану рассказывать детально в этой статье, лучший способ с ним познакомиться это одноименный раздел на сайте Алекса Отта. Там же есть постоянно обновляющаяся вводная статья написанная Алексом для журнала fprog.

Я участвую в проекте по обработке данных. Предыдущая версия использовала MS Sql Server для своей работы, поэтому анализ работы системы сделать было достаточно просто, можно было обойтись и простым t-sql скриптом или, если нужно было графическое представление, то можно было использовать Reporting services. Сейчас же, для того компонента, которым я занимаюсь, никакие СУБД не используются, поэтому какие-то выводы можно делать исключительно по логам. Поэтому даже был сделан отдельный структурированный лог в csv формате обо всех важных событиях, произошедших в системе. К примеру, к нам приходит много файлов, поэтому для каждого из этих фалов, этот лог содержит упрощённо 3 записи: файл найден, файл отправлен на обработку, файл обработан. Как то у Ярослава возникла идея попробовать язык R, чтобы нарисовать какие-нибудь интересные аналитические графики. Меня идея заинтересовала, я скачал книгу и впал в ступор. В общем и целом, язык этот мне не понравился (можно сказать не осилил:)). Но месяц назад в очередном порыве изучения clojure, у Алекса наткнулся на упоминания о проекте incanter. Лучше всего его описали сами авторы:

Incanter is a Clojure-based, R-like platform for statistical computing and graphics.

В этой статье я попробую рассказать, как я, человек знакомый с clojure только по статьям/книгам/скринкастам, использовал incanter для построения интересных, на мой взгляд, графиков работы нашего приложения.

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

Две стороны одной медали: удобство разработки

Хотел немного подробнее раскрыть упомянутый в предыдущем посте антипаттерн "Immutable Class", изобретение которого принадлежит моей клавиатуре. В данном конкретном случая, это была попытка в Java реализовать Immutable object. И тут возникла проблема, которая всегда актуальна в спорах "динамическая типизация vs статическая типизация". Т.е. с одной стороны можно сделать конечный код (который использует этот класс) более простым, с другой стороны мы получаем ошибки, которые, как правильно в исходном посте заметил Андрей не находятся компилятором. И это действительно произошло, у людей были проблемы с модификацией этого класса, из за чего он и был наречён immutable. Хотел бы более развёрнуто описать почему я так решил, вернее почему мне кажется, что ответ на это вопрос не так однозначен. В самом исходном посте одну из причин я уже указывал, это наследования с огромным количеством переопределенных методов. Тут хотел рассмотреть вопрос удобства изменения только этого класса. Комментарии и в особенности критика приветствуются.

воскресенье, 6 марта 2011 г.

О поиске простого решения или как я писал JobStore для Quartz

Java очень хорошо известна своим разнообразием различных Open Source frameworks, одни ребята из Apache наверно несколько десятков сгенерировали. Причём всегда есть много альтернатив (к сожалению, зачастую все равно выбрать нечего :))). Но есть планировщик задач Quartz, которому нет альтернативы, почти стандарт, так сказать. Причём с архитектурной точки зрения он довольно прост и хорош. У нас есть Scheduler в котором мы регистрируем Trigger'ы и Job'ы и связи между ними, таким образом каждый триггер может активировать одну или несколько работ.

Данная библиотека одна из ключевых в одном из наших подпроектов. Важный вопрос как всегда это persistence. Т.е. возможны следующие случаи к примеру:

  • Если триггер должен сработать только несколько раз. То после рестарта приложения Scheduler должен знать об этом и не активировать его.
  • Если у нас есть триггер, который должен срабатывать каждый час, но спустя, например, 59 минут наше приложение упало. То когда его перезапустили, этот триггер должен сработать через минуту, а не через час.

Это вопрос в Quartz так же решён. Есть интерфейс JobStore, к которому обращается Scheduler за всеми нужными данными и он должен обеспечивать сохранность данных. По умолчанию существуют две реализации RAM и JDBC. Как нетрудно догадаться, RAM никакой сохранности не обеспечивает, но JDBC по сути должно хватить всем, так как почти любая СУБД к вашим услугам. К сожалению для нас это не так, мы не используем СУБД. Поэтому пришлось реализовывать JobStore самостоятельно. И вот тут, тот, кто также успел сходить по ссылке на api JobStore, мог ужаснуться, так как JobStore - это интерфейс наверно на полсотни методов. Поэтому под катом, моя история, как я пытался малой кровью реализовать этого бегемота для наших нужд :)