Дружим Ruby со Spotlight и Quicklook

Илья • 21 декабря 2007 г.

Дейв Томас не так давно наткнулся на очень интересный плагин для поисковой системы Spotlight, встроенной в Мак ОС. После установки, плагин позволяет искать по модулям, классам, методам и комментариям в любых файлах Ruby, находящихся на вашем Маке. Великолепная штуковина!

Если есть желание попробовать, то качаем Ruby Importer 0.2.1, затем копируем файл RubyImporter.mdimporter в папку /Library/Spotlight (папку возможно придётся создать).

Далее, в терминале нужно запустить следующую команду, чтобы заставить спотлайт заметить новый плагин и проиндексировать с помощью него все Ruby-файлы в домашней директории:

$ mdimport -L && mdimport -r /Library/Spotlight/RubyImporter.mdimporter ~/

Теперь можно приступать к поиску:

А для того чтобы исходники Ruby (и других языков) можно было просматривать с подсветкой кода при помощи Quicklook, нужно установить отдельный плагин для квиклука QLColorCode.

Издательство Питер наконец-то завершило русский перевод второго издания книги-бестселлера Agile Web Development With Rails.

AWDWR это культовая книга, которая содержит в себе достаточно информации о рельсах, чтобы написать своё первое приложение с нуля. Просто незаменима для новичков и стажёров.

Уже сейчас книжку можно пред-заказать на Озоне, а доставлена она будет в феврале.

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

$ rake -T clear
(in /Users/ilya/work/application)
rake db:sessions:clear   # Clear the sessions table
rake log:clear           # Truncates all *.log files in log/ to zero bytes
rake tmp:cache:clear     # Clears all files and directories in tmp/cache
rake tmp:clear           # Clear session, cache, and socket files from tmp/
rake tmp:pids:clear      # Clears all files in tmp/pids
rake tmp:sessions:clear  # Clears all files in tmp/sessions
rake tmp:sockets:clear   # Clears all files in tmp/sockets

То есть, после rake -T можно написать любое интересуемое вас слово, в данном случае clear. И тогда на экран выведутся только задачи в названии которых это слово встречается.

За открытие спасибо Антонюку Стасу ;)

Upd: Переписал описание и пример. Как оказалось позднее, выводятся не только задачи, у которых именная область совпадает с введённым словом, но и вообще все задачи, в название которых это слово включено.

Beanstalk — Subversion для людей

Илья • 19 ноября 2007 г.

Компания Wildbit не так давно анонсировала своё новое веб-приложение Beanstalk. Хочу написать небольшой обзор, потому что проект действительно интересный.

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

Хочу порекомендовать ещё одну замечательную книгу — Программист–прагматик. Путь от подмастерья к мастеру от Энди Ханта и Дейва Томаса.

Книжка является сборником советов и рекомендаций о том, как стать более эффективным программистом. Она компактная и очень легко читается.

Её авторы имеют огромный опыт в создании различных программных продуктов и им действительно есть чем поделиться. Рекомендую всем, кто занимается программированием профессионально.

Наверное лучшая техническая книга из всех что я читал.

Сегодня Apple назвала дату начала продаж новой версии операционной системы Mac OS 10.5 Leopard — 26 октября.

В Леопарде более 300 нововведений и улучшений. Наш любимый фреймворк не остался в стороне:

Да, Ruby on Rails, Ruby, Rubygems и Capistrano теперь идут в комплекте с каждым Маком. Ну разве это не здорово? ;)

Приятное обновление error_messages_for

Илья • 14 октября 2007 г.

В Edge Rails и Rails 2.0 теперь можно указывать допонительные параметры методу error messages for, который выводит ошибки валидации во вьюшках:

  1. :header_message По умолчанию: “<count> errors prohibited this <object_name> from being saved”
  2. :message По умолчанию: “There were problems with the following fields:"

<%= error_messages_for :user, 
  :header_message => "#{@user.errors.size} ошибок сохранения этого пользователя", 
  :message => "Следующие поля заполнены не верно:" %>

Так что теперь можно спокойно использовать эту удобную функцию в русских проектах.

Changeset #7870

Не так давно в распоряжении Rails-программистов появился метод form for, который позволяет сэкономить пару строчек кода, во время написания шаблонов форм. Используя этот метод, мы можем превратить такой стандартный шаблон:


<% form_tag users_path do %>
  <%= text_field :user, :name %>
  <%= text_field :user, :email %>
<% end %>

в такой:


<% form_for :user, :url => users_path do |f| %>
  <%= f.text_field, :name %>
  <%= f.text_field, :email %>
<% end %>

Используя form_for, больше нету необходимости указывать более чем один раз кому принадлежит то или иное поле. Это уменьшает количество повторений в вашем коде, то есть делает его более DRY.

Но что делать, если вы хотите использовать сразу несколько моделей в рамках одной формы? В такой ситуации нам на помощь придёт метод fields for, который переопределяет объект, к которому будут принадлежать поля, находящиеся в его блоке.

Всё просто, давайте разберём следующий пример. В одной и той же форме мы хотим редактировать данные и пользователя, и его кредитной карты:


<% form_for :user, :url => users_path do |f| %>
  <%= f.text_field, :name %>
  <%= f.text_field, :email %>

  <% fields_for :credit_card do |cf| %>
   <%= cf.text_field :number %>
   <%= cf.text_field :holder_name %>
  <% end %>

<% end %>

Используя fields_for в примере выше, мы получили возможность описать сразу две модели в одной форме. Теперь в контроллере у нас доступны и params[:user] и params[:credit_card].

Эта тема так же подробно раскрывается в эпизоде 73 от Railscasts.

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


User.create! \
  :name => 'Вася',
  :password => '12345',
  :login => 'vasya'

name = first_name +
       last_name +
       middle_name

name = "Sabanin" \
       " Ilya" \
       " Vladimirovich"  
# name => "Sabanin Ilya Vladimirovich" 

array.
  find_all {|e| e.position > 5}.
    map {|e| e.symbol}.
      join('/').
        downcase

Текст для Web: понятные заголовки

Илья • 30 сентября 2007 г.

Джонатан Прайс и Лиза Прайс в книге «Текст для Web»:

Представляйте тему статьи в тех терминах, которые используются потенциальными посетителями. Не предлагайте никаких каламбуров, шуток или метафор, а только суть контента. Странные заголовки могут вынудить посетителя щёлкнуть мышью и обнаружить Web-страницу, которая не отвечает его ожиданиям. В результате пользователи будут подозрительно относиться к двусмысленным заголовкам, которые могут представлять совершенно разные темы.

Напомнило мне причину, по которой я перестал читать Мембрану.

Замечательная книга, рекоммендую.

Безопасность Rails: фильтрация логов

Илья • 25 сентября 2007 г.

Если в вашем приложении используются такие важные данные как номера кредитных карт или пользовательские пароли, то вам стоит фильтровать свои логи, в которые эта секретная информация просачивается.

Сделать это очень просто. Достаточно вставить следующую строку в ApplicationController:


class ApplicationController < ActionController::Base
  filter_parameter_logging :password
end

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

Важный нюанс: метод filter_parameter_logging использует регэкспы, для сравнения параметров, так что код, приведённый выше, будет работать для всех параметров, в названии которых содержится слово password.

Вот как выглядят логи с отфильтрованным параметром :password:

Processing AccountsController#login (for 127.0.0.1 at 2007-09-25 03:56:02) [POST]
  Session ID: 66e0c98d03cc80433cecfe3cf76f65aa
  Parameters: {"login"=>"vasya", "password"=> "[FILTERED]", 
               "password_confirmation"=> "[FILTERED]"}

Берегитесь операторов and, or и not в Ruby

Илья • 21 сентября 2007 г.

С виду безобидные операторы and,  or  и not могут привести к очень загадочным ошибкам в вашем приложении.

Вот две строчки одинакового кода. В первой строке используются операторы ||  и &&, а во второй операторы  or  и and. Как видите, результат не совпадает:

Всё потому-что в таблице приоритетов операторов в Ruby, оператор && стоит выше оператора ||, в то время как операторы and  и  or находятся на одном уровне.

Что самое неприятное, операторы and  и  or стоят по приоритету даже ниже чем оператор =, а это может создать в коде ошибки следующего типа:

По-скольку оператор = имеет больший приоритет, чем оператор  or, руби сначала присваивает значение false переменной value, а затем сравнивает её со значением true. Получается, что вместо значения true в переменной value, мы получаем значение false.

Такой же код, но с оператором || вместо  or:

Теперь всё работает как надо.

Итак, старайтесь заменять операторы and,  or  и not  на &&, ||  и !. Конечно, вторая тройка не такая красивая и читабельная, но читабельность того не стоит.

Первая книга про Ruby на русском

Илья • 18 сентября 2007 г.

Очень порадовало наткнуться на Озоне на первую книгу про Ruby на русском языке.

Перевести почему-то решили первое издание The Ruby Way Хэла Фултона, выпущенного аж в далёком 2001 году, не смотря на то что ещё в прошлом году вышло второе. С такой скоростью мы вряд-ли увидим первые книги по рельсам на русском языке в ближайшем будущем…

The Ruby Way будет весьма интересна людям, которые уже знакомы с программированием и основами Руби. Новичкам же придётся подождать пока на русский переведут Programming Ruby или Ruby Cook Book.

По старой доброй русской традиции, издатель русской версии The Ruby Way до неузнаваемости изуродовал её оригинальную обложку. Им чем-то не понравилось деревце из которого растёт цветная капуста, изображённое на обложке в оригинале, поэтому пришлось изворачиваться и рисовать соплевидный плевок грязно-бардового цвета и прикреплять клипартовый рубин на чёрном фоне. Этот шедевр вообще сложно описать словами, лучше взгляните на него сами:

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

Update: как мне помогли выяснить мои любезные читатели, эта книга является переводом второго издания The Ruby Way, а не первого, как я считал ранее. Хороший повод всё-таки купить эту книжку…

Один маленький нюанс :counter_cache

Илья • 18 июля 2007 г.

Если вы хотите использовать :counter_cache для своих ассоциаций, не забудьте что поле, в котором будет хранится количество связей, должно иметь дефолтовое значение 0, а не NULL, как это иногда бывает по-стандарту.

class AddCounterCaches < ActiveRecord::Migration
  def self.up
    add_column :posts, :comments_counter, :integer, :default => 0
  end

  def self.down
    remove_column :posts, :comments_size
  end
end

Сегодня в порыве продуктивно-оптимизационной истерии нашел удобный способ отображать проект в Textmate Drawer.

Превратил такой, “стандартный” вариант:

В такой:

Суть такая, создаем новый проект, из Finder перекидываем содержимое app/ в Drawer. Это то, что мы используем чаще всего. Следом создаем в Drawer новую группу – rails root, куда засовываем всё остальное.

Кстати, вы знали что по запросам в Гугле продуктивность популярней чем порно? vs.