РИТ++ 12-14 апреля, Москва

Опубликовано 01.04.2010

Итак, 12-14 апреля я буду читать доклад о Ruby on Rails на конференции РИТ++ 2010. Программа конференции уже официально сформирована, поэтому я могу заявить об этом официально.

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

Однако, конференция – это не единственное ради чего я поеду в столицу, есть еще масса интересных дел, которым я хотел бы посвятить часть времени. Например, мне бы хотелось пообщаться с коллегами-рельсовиками и/или прийти в гости в какую-нибудь компанию, где активно занимаются разработкой проектов на Ruby on Rails. Уверен, у нас найдутся общие темы для общения.

Я буду в Москве с утра 9 апреля и до вечера 14 апреля. Если у вас есть желание встретиться или пригласить меня в гости – пишите письма или стучитесь в Jabber/GTalk rene.dekart@gmail.com

Расширение ассоциаций в Rails

Опубликовано 12.10.2009

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

Давайте немного поговорим об ассоциациях. Если вы программируете на Rails дольше 15 минут, то уже наверняка знаете, что рельсы поддерживают несколько типов ассоциаций – belongs_to, has_one, has_many и has_and_belongs_to_many. Каждый тип ассоциаций решает определенную задачу, у каждого свой API. Но есть у них одна общая замечательная особенность – ассоциации можно расширять.

Допустим, у нас есть проект “Доска объявлений”, где пользователь может опубликовать до 5 объявлений каждое стоимостью 10 долларов. Давайте взглянем на модель пользователя, содержащую несколько методов для проверки возможности публикации объявлений:

class User < ActiveRecord::Base
  has_many :classifieds

  def can_publish_classified?
    has_free_classified_slots? and enough_money_to_publish_classified?
  end

  def has_free_classified_slots?
    self.classifieds.size <= 5
  end

  def enough_money_to_publish_classified?
    self.balance >= 10
  end
end

Вот так выглядят вызовы методов проверок:

@user.can_publish_classified?
@user.has_free_classified_slots?
@user.enough_money_to_publish_classified?

Обратите внимание на постоянно повторяющееся слово classified в названиях методов. Было бы гораздо удобнее, если бы методы вызывались в контексте того, к чему они непосредственно относятся, а именно – в контексте ассоциации classifieds. Именно для таких случаев в Rails реализована возможность расширения ассоциаций, а точнее – прокси-классов, которые эти ассоциации обслуживают. Делается это следующим образом:

class User < ActiveRecord::Base
  has_many :classifieds do
    def can_publish?
      free_slots? and enough_money_to_publish?
    end

    def free_slots?
      self.size <= 5
    end

    def enough_money_to_publish?
      proxy_owner.balance >= 10
    end
  end
end

Теперь проверки возможности публикации объявлений выглядят у нас так:

@user.classifieds.can_publish?
@user.classifieds.free_slots?
@user.classifieds.enough_money_to_publish?

Существенно лучше, не так ли? Обратите внимание на метод proxy_owner, который вызывается в методе enough_money_to_publish?. Его описание, а так же описание других полезных методов прокси-класса ассоциации можно найти в документации (см. Association extensions):

  • proxy_owner – объект, частью которого является данная ассоциация (в нашем случае экземпляр класса User)
  • proxy_reflection – объект класса ActiveRecord::Reflection::AssociationReflection, хранящий в себе сведения об ассоциации
  • proxy_target – объект или коллекция объектов, которые загружаются ассоциацией (в нашем случае это коллекция объявлений, привязанных к пользователю); загрузка этих данных выполняется вызовом метода load_target

Однако давайте допустим, что авторами объявлений у нас могут стать не только пользователи, но еще и компании (модель Company). Есть два пути добавления методов в ассоциацию второй модели – copy-paste и вынос методов в отдельный модуль. Я думаю, нет сомнений, что второй путь более правильный.

Выносим код расширения в отдельный модуль:

module ClassifiedExtension
  def can_publish?
    free_slots? and enough_money_to_publish?
  end

  def free_slots?
    self.size <= 5
  end

  def enough_money_to_publish?
    proxy_owner.balance >= 10
  end
end

А затем расширяем им ассоциации:

class User < ActiveRecord::Base
  has_many :classifieds, :extend => ClassifiedExtension
end

class Company < ActiveRecord::Base
  has_many :classifieds, :extend => ClassifiedExtension
end

Как видите, расширять ассоциации совсем не сложно. Однако, как ни странно, далеко не все разработчики, даже опытные, используют эту возможность. А зря :)

DoS-уязвимость в Ruby

Опубликовано 10.06.2009

В ruby найдена уязвимость к DoS-атаке. Злоумышленник может вызвать нарушение работы интерпретатора, передав очень большое значение в функцию, использующую BigDecimal. Уязвимости подвержены следующие версии ruby:

  • Ruby 1.8.6-p368 и более ранние
  • Ruby 1.8.7-p160 и более ранние
  • Ruby Enterprise Edition 20090520 и более ранние

Код, с помощью которого можно выявить наличие проблемы (можно выполнить, например, в irb-консоли):

require 'bigdecimal'
BigDecimal("9E69999999").to_s("F")

Программисты из Phusion буквально только что выпустили исправленную версию Ruby Enterprise Edition. Советую всем обновиться до новой версии.

Вышел NetBeans 6.5

Опубликовано 24.11.2008

Толя буквально только что порадовал новостью: вышел в свет NetBeans 6.5

В новой версии:

  • Поддержка PHP (привет братьям нашим меньшим)
  • Поддержка Groovy и Grails (привет братьям по разуму)
  • Улучшена поддержка JavaScript, AJAX и Ruby (привет и нам тоже :)
  • Много изменений для улучшения жизни Java-разработчиков (не будем вникать)

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

Сейчас качаю. Чего и вам от всей души желаю.

Я хочу забыть про JavaScript!

Опубликовано 09.11.2008

Желание выкинуть из головы это слово всплывает во мне всякий раз когда я хочу сделать в своем приложении нечто более сложное, чем показать или скрыть элемент. Синтаксис JavaScript меня просто убивает. Когда я пишу очередную функцию - меня терзают муки совести. Каждый раз, когда я хочу создать класс объектов, я мучаюсь приступами мигрени. Я не выношу этот язык!

Как вы думаете, к чему я это вам рассказываю? К тому, что есть свет в конце тоннеля!

Если вы еще не знаете про Red - самое время познакомиться. Это мощный инструмент, который компилирует код, написанный на Ruby, в обычный JavaScript, воспринимаемый браузером. После просмотра видео у меня аж руки зачесались переделать существенную часть клиентских скриптов:

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

Обновление списка фреймворков, часть 2

Опубликовано 31.03.2008

Вновь дошли руки до списка ruby-фреймворков, написал по паре предложений про Sinatra, StaticMatic, Nanoc, Waves, Halcyon и Nitro.

Обновление в списке фреймворков

Опубликовано 15.03.2008

По просьбам трудящихся я дополнил список фреймворков небольшими аннотациями, а так же добавил в список фреймворк Waves. Продолжение следует. Комментарии, кстати, приветствуются :)

Не смешивайте Ruby и Rails

Опубликовано 14.03.2008

Мне хоть и нравятся рельсы, но все же я не позволяю себе забывать, что мир Ruby-фреймворков не ограничивается только Rails. Поэтому не забываю следить за жизнью и других фреймворков, чего и вам желаю. Вот они:

  • Merb
    Пожалуй, наиболее продвинутый из альтернативных фреймворков в плане функционала. Из особенностей можно отметить фактически полную независимость от ORM - можно использовать на выбор ActiveRecord, DataMapper или Sequel (про последний рекомендую почитать Константина Тумалевича - ссылка раз, ссылка два). Удобен для реализации веб-сервисов или небольших сайтов, требовательных к нагрузке. Полезное чтиво: merb + datamapper + noob: quick start

  • Camping
    Еще более компактный и легковесный, чем Merb, однако по-прежнему динамический. Что меня смущает, так это разметка шаблонов (views) с помощью Markaby. Я понимаю, что программисты в большинстве своем - перфекционисты. Однако простому верстальщику от этого не легче.

  • Mack
    Тоже вполне себе легковесный, вышел . Из преимуществ - использует Rack и Thin, что дает существенный потенциал в плане производительности. Thin мы недавно начали использовать в production и о нем тоже стоит написать отдельную заметку. Напомните мне плиз :)

  • Ramaze
    В принципе похож на предыдущие, но с одним отличием - в качестве шаблонизатора используется собственный движок под названием Ezamar (другие движки тоже поддерживаются), позволяющий создавать собственные теги. Принцип схож с движком Radius, который используется в Radiant CMS.

  • Webby
    Относится скорее к семейству микро-CMS, т.к. фактически генерирует статичные HTML-страницы. Из удобств - одновременная поддержка шаблонов Erb, Textile, Markdown и Haml. Плюс позволяет сделать подсветку синтаксиса с помощью библиотеки CodeRay (ссылку не даю, т.к. сайт лежит), визуализацию диаграмм с помощью Graphviz и запуск демона для автоматической генерации статики при внесении изменений.

  • Sinatra
    Динамический фреймворк, очень легковесный, не завязан на ORM. Фактически, представляет из себя просто обертку для разбора урлов и отдачи сгенерированного контента. Можно использовать ERB и HAML, однако код шаблонов пишется прямо в контроллере, что на мой взгляд есть признак дурного вкуса.

  • StaticMatic
    Библиотека для генерации статичных сайтов, о ней я уже писал. В принципе годится для создания простеньких сайтов с десятком страниц, весьма удобна в использовании. Разметка делается с помощью HAML.

  • Nanoc
    Очень похоже на StaticMatic, но с одним существенным отличием - информация хранится отдельно от представления. Кроме того, в nanoc можно использовать БД для хранения данных, что является весьма интересным преимуществом.

  • Waves
    Появился на сцене совсем недавно, динамический, использует Rack, Sequel и все такое. На мой взгляд, просто переизобретение трехколесного велосипеда на солнечных батарейках. Слишком много кода для реализации слишком простых вещей.

  • Halcyon
    Фреймворк включает в себя сервер и клиент для обмена информацией в формате JSON. Фактически можно использовать для обмена информацией между серверами (можно даже на разных платформах).

  • Nitro
    Пожалуй, это самая темная из всех вышеперечисленных лошадок. По масштабам этот фреймворк сравним, пожалуй, с Merb, однако существующая документация дает весьма размытую картинку происходящего. Ясно следующее: это динамический фреймворк, использующий собственную ORM под названием Og, обработчик шаблонов с возможностью создания собственных тегов, встроенную систему локализации, скаффолдинг и кэширование. Специально для пытливых умов есть серия хитрых tutorial’ов, оставляющих вопросов больше, чем ответов.

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

nanoc

Опубликовано 05.01.2008

В продолжение предыдущего поста: StaticMatic - не единственная библиотека, с помощью которой можно генерировать статичные сайты. Буквально только что наткнулся на библиотеку nanoc, решающую примерно ту же задачу. У ее есть серьезное отличие - она имеет гораздо более сильное отделение контента от шаблонов. Рекомендую взглянуть.

Играемся со StaticMatic

Опубликовано 04.01.2008

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

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

Как вы сами понимаете, искать я его начал не где-нибудь, а в Ruby-мире. И довольно быстро нашел, причем в своих же закладках. Им оказался инструмент под названием StaticMatic - мини-фреймворк для создания статичных сайтов. Проект с шаблонами (используется HAML), хелперами, partial’ами по команде преобразуется в статичную копию - папку с HTML-страницами, картинками, стилями и javascript’ами - которую можно смело заливать на сервер или использовать локально (как в моем случае). Для моих нужд подходит просто идеально.

Установка:

gem instal staticmatic

В итоге за полчаса наваял себе новый многостраничный портальчик, генерирующийся по требованию, даже прикрутил простенький CSS-шаблон. А заодно наваял небольшую стартовую страницу для Ruby-девелоперов, которую презентую вам: Ruby Developer Start Page. Пользуйтесь на здоровье :)

Не рельсами едиными жив Ruby.