Получение списка из различных моделей в Ruby on Rails

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

Предположим, что у нас в приложении есть модели Post и Question и мы хотим на главной странице их вперемежку упорядоченными по дате создания. Какие возможны решения?

Читать дальше »

Создание билдеров (builders) в Ruby

Давно я не писал ничего, постараюсь исправиться…

Сегодня я рассмотрю создание в Ruby билдера – подобного тому, который строит разметку (http://builder.rubyforge.org/), но чуть попроще. В частности, строить мы будем произвольные Ruby-объекты.

Как это должно выглядеть? В идеале вот так:


obj = TestObj.build
  first_prop 11
  second_prop 'qwerty'
end
obj # <TestObj:0x7fd655d04958 @first_prop=11 @second_prop="qwerty">

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

Читать дальше »

Разработка приложений с Akonadi: добавление задач в календарь

Недавно, благодаря хорошей идее на KDE Brainstorm я создал плагин для KDE Plasma Runner, позволяющий быстро добавлять задачи и события в календарь, исходный код которого доступен на GitHub.

Сегодня я хотел бы поделиться опытом создания, а конкретно рассмотреть тему написания приложений, использующих Akonadi.

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

Читать дальше »

Организация взаимодействия Java-приложений с помощью JGroups

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

  • Создавать и уничтожать группы
  • Присоединяться к группам и покидать их
  • Получать оповещения о новых членах групп
  • Отправлять сообщения конкретному процессу или всем процессам группы
Библиотека достаточно широко используется, в частности в сервере приложений JBoss, в кэше OSCache и в Grid-платформе Infinispan.

Здесь я ограничусь начальной информацией и опишу создание простого группового чата на Java.

Читать дальше »

Irwi - Wiki в Rails-приложениях

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

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

Основными критериями при разработке были:

  • Возможность быстрой интеграции в приложение.
  • Хорошая расширяемость.
  • Отсутствие чужого кода (в смысле кода плагина) в приложении, к чему часто приводит использование генераторов. В этом смысле я пытался равняться на Authlogic.

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

Читать дальше »

Средства тестирования в Ruby on Rails

Как известно, тестирование является одной из важнейших составляющих разработки приложений на основе Ruby on Rails. Поддержка тестирования была включена в Rails с самого начала, для этого использовалась библиотека Test::Unit. Однако, со временем, появилось много альтернативных средств для тестирования в Rails-приложениях.

В этой заметке я проведу небольшой обзор средств, используемых в настоящий момент для тестирования приложений на базе Ruby on Rails. Я не ставлю себе целью выбрать “лучшее” – я считаю, что этот выбор должен делать каждый сам, однако я попытаюсь показать различные варианты – чтобы было из чего выбирать.

Читать дальше »

Навигация по сайту в пользовательском поиске Google

Некоторое время назад я прикрутил к своему блогу поиск Google на основе пользовательского поиска. После некоторого осмотра возможностей пользовательского поиска я обнаружил “уточнения”, позволящие создавать дополнительные ссылки в интерфейсе поиска для уточнения результатов поиска.

Поскольку я пишу и о C++, и о Java, и о Ruby, естественным было бы добавить туда уточнения вида “C++”, “Java” и “Ruby”, позволяющие включать в результаты поиска только страницы с заданными тэгами. Как это выглядит можно посмотреть на картинке внизу, или по после нажатия кнопки “Найти” в блоге справа вверху.

Здесь я опишу, как такое можно осуществить.

Читать дальше »

Typus - админка в Rails-приложениях

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

И поэтому я был очень рад обнаружить замечательный проект: Typus. Это плагин для Rails, позволяющий значительно упростить процесс создания админки для приложений.

Читать дальше »

Использование Boost Pointer Container Library

Как часто Вам приходилось хранить в стандартных STL контейнерах указатели на объекты? Я думаю, достаточно. Но хранение обычных указателей приводит к тому, что приходится тратить дополнительные усилия на то, чтобы проверять, что память освобождается при уничтожении контейнера.

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

А судя по замерам, накладные расходы по производительности и памяти на подсчет ссылок достаточно велики: Boost smart pointer timings.

Что же делать в таких случаях? На помощь приходит очередная библиотека в составе Boost - Pointer Container Library. Она предоставляет основные контейнеры, схожие со стандартными, специально предназнченные для хранения указателей.

Читать дальше »

XML-RPC в Ruby

Как известно, XML-RPC является достаточно распространенным методом вызова удаленных процедур, основанным на XML. Однако, несмотря на то, что он значительно проще, чем, например, SOAP, его использование все еще иногда достаточно сложно: необходимо сериализовать объекты в специальное XML-представление, затем распарсить полученный релзультат.

Однако, на самом деле, не все так плохо!

В стандартной библиотеке Ruby существует замечательная поддержка XML-RPC, о которой я немного расскажу далее.

Читать дальше »