Программирование на Ruby - Новости

Play - музыкальный сервер от GitHub

Продолжая тему слайдов, хочу поделиться ссылкой на стопку слайдов к выступлению Зака Холмана (Zach Holman) - "Stories From a Music-Fueled Distributed Streaming Bender". Вы узнаете о проекте Play - музыкальном сервере в офисе GitHub.

Просто красивые слайды, это еще не конец истории :) Код Play открыт и доступен на GitHub - github.com/play/play. Play имеет специфичные требования к окружению, но об этом подробно рассказано в README.

P.S. Советую посмотреть и другие слайды от Зака, если вы этого еще не сделали.

Источник: rubyflow.ru

Слайды доклада "10 Things You Didn't Know Rails Could do" от JEG2

Прогугливаясь по просторам интернета в поисках инетересной информации, я наткнулся на доклад ruby-гуру Джеймса Эдварда Грея II. В нем собрана информация о функциональности rails, о которой вы, возможно, и не знали. Лично я для себя нашел достаточно много нового, надеюсь, вы тоже найдете... Приятного чтения!

Ссылка: https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do

С уважением, @rezwyi.

Источник: rubyflow.ru

"Stay young, stay curious, stay hippy..." - доклад Дэвида Хайнемайера Хенссона с конференции "RailsConf 2012"

В сети выложен видео-доклад Дэвида с конференеции "RailsConf 2012". Всем, кто еще не видел, очень советую...

Молодой, знергичный, дерзкий и в то же время достаточно мудрый, он высказал свою точку зрения на прогресс в разработке программного обеспечения в целом и rails в частности.

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

Ссылка:
https://www.youtube.com/watch?v=VOFTop3AMZ8

С уважением, @rezwyi.

Источник: rubyflow.ru

Skypekit for Ruby

Skypekit для Ruby - библиотека для работы со Skype протоколом

http://blog.railsware.com/2012/05/11/libskypekit-and-skypekit-c-and-ruby-interface-for-skype/

Источник: rubyflow.ru

ActiveRecord::Relation#merge или как объединиться с друзьями

Цель данного обзора показать пару приемов использования метода #merge из модуля ActiveRecord::SpawnMethods, предназначенного для объединения скоупов.
relation_destination.merge(relation_source) добавляет sql-выражение из relation_source в итоговый relation_destination. Приведу пару примеров.

Допустим мы хотим получить список всех оплаченных заказов, но только для клиентов с голубыми глазами. В общем случае это могло бы быть так:

Order.paid.joins(:user).where(:users => { :eye_color => 'blue' })

# => SELECT "orders".*
     FROM "orders"
     INNER JOIN "users" ON "users"."id" = "orders"."user_id"
     WHERE "orders"."status" = 3 AND "users"."eye_color" = 'blue'

Но в таком подходе есть проблема: мы должны знать все тонкости выборки этих самых клиентов с голубыми глазами. И возможно, что таковыми должны быть не только клиенты с признаком eye_color => 'blue', но и со статусом равным 1. В таком случае, чтобы разместить логику «голубых глаз» в едином удобном месте логично сделать scope в модели User:

class User < ActiveRecord::Base
  STATUS = { :visible => 1 }
  has_many :orders

  scope :blue_eye, where(:eye_color => 'blue', :status => STATUS[:visible])
end

Теперь мы можем изменить первый вариант на:

Order.paid.where(:user_id => User.blue_eye.pluck(:id))

# => SELECT id FROM "users" WHERE "users"."eye_color" = 'blue' AND "users"."status" = 1
# => SELECT "orders".* FROM "orders"
     WHERE "orders"."status" = 3 AND "orders"."user_id" IN (2, 3)   

Таким образом мы избавились от первоначальной проблемы. Но возник другой момент: такая запись генерирует 2 запроса к БД (к пользователям и к заказам). При этом id'шники пользователей будут переданы во второй sql-запрос. И если пользователей с голубыми глазами будет много (сотни/тысячи), то sql-команда получится очень длинной и в большинстве случаев далеко не оптимальной (разбор плана и т.д.).

И вот на помощь к нам приходит Relation#merge:

Order.paid.joins(:user).merge(User.blue_eye)

# => SELECT "orders".*
     FROM "orders" INNER JOIN "users" ON "users"."id" = "orders"."user_id"
     WHERE "orders"."status" = 3 AND "users"."eye_color" = 'blue' AND "users"."status" = 1

Такая цепочка вернет нужные нам заказы за один запрос с использованием SQL оператора JOIN. На мой взгляд, это выглядит достаточно лаконично, причём как с точки зрения AR, так и точки зрения результирующего sql-запроса. Если по какой-то причине мы изменим логику получения клиентов с голубыми глазами, то достаточно будет изменить scope в модели User и все другие запросы получат новые условия.

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

class Friendship < ActiveRecord::Base
  STATUS = {:verified => 5}
  belongs_to :user
  belongs_to :friend, :class_name => 'User',
             :conditions => { :friendships => { :status => STATUS[:verified] } }
end

class Article < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  STATUS = { :visible => 1 }
  has_many :friendships, :dependent => :destroy
  has_many :friends, :through => :friendships,
           :conditions => { :status => STATUS[:visible] }
  has_many :articles

end

Несколько вариантов достижения поставленной цели:

1) Все условия зараз:

user = User.first

 Article.joins(:user).joins('INNER JOIN friendships on users.id = friendships.friend_id').
   where(:friendships => { :user_id => user, :status => Friendship::STATUS[:verified]}).
   where(:users=>{:status => User::STATUS[:visible]}).order('articles.rating desc')

# => SELECT "articles".*
     FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
     INNER JOIN friendships on users.id = friendships.friend_id
     WHERE "friendships"."user_id" = 1 AND "friendships"."status" = 5 AND "users"."status" = 1
     ORDER BY articles.rating desc

2) 2 sql-запроса, идентификаторы пользователей передаются списком в функцию IN:

user = User.first
Article.where(:user_id => user.friends).
  order('articles.rating desc')

# => SELECT "users".*
     FROM "users" INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id"
     WHERE "friendships"."user_id" = 1
     AND ("friendships"."status" = 5 AND "users"."status" = 1)

# => SELECT "articles".* FROM "articles"
     WHERE "articles"."user_id" IN (2, 3)
     ORDER BY articles.rating desc

3) В один запрос с JOIN:

user = User.first
Article.joins(:user).merge(user.friends.scoped).
  order('articles.rating desc')

# => SELECT "articles".*
     FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
     INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id"
     WHERE "friendships"."user_id" = 1
     AND ("friendships"."status" = 5 AND "users"."status" = 1)
     ORDER BY articles.rating desc

Пример с Relation#merge демонстрирует как получить sql-запрос с объединением по друзьям. Не мало важно то, что в запрос включены все те условия, которые мы задали в ассоциациях.

На этом можно было бы и закончить данный обзор, но остался ещё один подводный камень: в Rails 3.0.x такой красивый merge к сожалению изменит SELECT "articles".* FROM на SELECT "users".* FROM, что в результате вернет пользователей, а не статьи. Чтобы это побороть, можно добавить метод экземпляра в модель User:

def join_friends
  Friendship.scoped.
    joins('INNER JOIN friendships on friendships.friend_id = users.id').
    where(:user_id => id, :status => Friendship::STATUS[:verified]).
    where(:users => {:status => STATUS[:visible]})
end

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

user = User.first
Article.joins(:user).merge(user.join_friends).
  order('articles.rating desc')

# => SELECT "articles".*
     FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
     INNER JOIN friendships on friendships.friend_id = users.id
     WHERE "friendships"."user_id" = 1 AND "friendships"."status" = 5 AND "users"."status" = 1
     ORDER BY articles.rating desc

Вот и все, спасибо за внимание!

Полезные ссылки:

Источник: rubyflow.ru

DevConf: открыто голосование

Всего подано 57 заявок в восьми категориях. В категории посвященной Ruby предлагаются следующие темы:

У вас есть возможность отдать свой голос за интересные доклады - http://devconf.ru/offers/

Источник: rubyflow.ru

Для заинтересовавшихся RubyMotion

Репозиторий с эксперементальными проектами - github.com/railsfactory/rubymotion-learn.

В файле projects.md можно найти большое количество ссылок на проекты с открытым кодом на базе RubyMotion.

Если вы еще не знаете что такое RubyMotion, то начните со статьи "Ruby для iOS".

Источник: rubyflow.ru

SeedDump

SeedDump - плагин добавляющий rake-задачу db:seed:dump. Эта задача генерирует файл db/seeds.rb на основе уже существующей базы данных.

Пример:

rake db:seed:dump

Получаем файл db/seeds.rb со следующим содержимым:

# Autogenerated by the db:seed:dump task
# Do not hesitate to tweak this to your needs

products = Product.create([
  { :category_id => 1, :description => "Long Sleeve Shirt", :name => "Long Sleeve Shirt" },
  { :category_id => 3, :description => "Plain White Tee Shirt", :name => "Plain T-Shirt" }
])

users = User.create([
  { :id => 1, :password => "123456", :username => "test_1" },
  { :id => 2, :password => "234567", :username => "tes2" }
])

Есть возможность добавлять в файл, а не перезаписывать его. Можно указать другой выходной файл, а не только db/seeds.rb.

Узнайте остальные подробности в README на GitHub - github.com/rhalff/seed_dump

Источник: rubyflow.ru

Bloggy - возможность добавить блог на базе Jekyll в Rails-приложение

Bloggy - это небольшая библиотека, позволяющая "завести" блог на базе Jekyll в вашем Rails-приложении.

Jekyll - это генератор статических сайтов, созданный Томом Престоном-Вернером (Tom Preston-Warner).

Чтобы начать пользоваться Bloggy, добавьте в Gemfile следующую строку:

gem ‘bloggy’

и выполните

$ bundle

Далее генерируем все необходимое для первого старта:

$ rails g jekyll:blog blog

Готово! Ваш блог доступен по адресу http://yourdomain.com/blog

Хотите знать больше? Читайте подробности в README на GitHub - github.com/zbruhnke/bloggy

Источник: rubyflow.ru

Фестиваль профессионального развития для IT-специалистов – Bit Byte

19 мая компания ITmozg проводит в Санкт-Петербурге крупнейшее мероприятие для IT-специалистов – Bit Byte.

Bit Byte – это фестиваль профессионального развития, где студенты технических специальностей, и специалисты с опытом работы в IT в 2-4 года после окончания ВУЗа смогут пообщаться с представителями крупнейших IT-компаний и успешных стартапов и послушать выступления звезд IT.

В программе:

Общение с лучшими компаниями страны и города: EMC, Mail.ru Group, Oracle, Embria, Motorola Mobility, Ascreen , Epam, «Код безопасности», «Институт Сетевых технологий» и другие.

Выступления экспертов. Своим опытом поделятся эксперты из проекта «Одноклассники» компании Mail.ru Group, компаний «Яндекс.Деньги», «Фотострана.ру», Oktogo, Sup Media. Из Москвы специально на мероприятие приезжают Алена Попова и Леонид Бугаев. Руководитель ЖЖ в России, Илья Дронов, тоже приедет на конференцию, правда, не выступать, а просто как участник.


А также внимание к стартапам, гаджеты и игрушки.

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

Все подробности на сайте фестиваля.

Источник: rubyflow.ru

Ruby для iOS

RubyMotion позволяет писать нативные iOS-приложения на Ruby, а не Objective-C.

Вы пишите приложение, используя привычные для Ruby-программиста инструменты - консоль, Rake, gem-библиотеки, ваш любимый текстовый редактор.

RubyMotion не является бесплатным продуктом, но сейчас можно получить скидку в 25% (early bird discount). На данный момент стоимость пакета с учетом скидки составляет 4638,22 руб.

Ссылки по теме:

Источник: rubyflow.ru

Brainwashing: мастер-класс по разработке на Ruby on Rails

Evil Martians проводят brainwashing в третий раз.

На курсе будет 18 учеников и 3 инструктора из Evil Martians. Это позволит инструкторам проводить практические занятия, уделять максимум внимания каждому участнику.

Курс состоит из восьми блоков-тем, каждая из которых состоит из теоретической и практической части. Участники курса за два дня получат багаж новых знаний и смогут уже в понедельник начать применять их на практике:

  • как определять, что не так с приложением и как это исправить;
  • как оптимизировать и автоматизировать фронт-энд;
  • как организовывать работу с кодом;
  • как готовить приложение к высоким нагрузкам и решать возникающие при этом проблемы.

Brainwashing будет полезен уже опытным Ruby on Rails разработчикам, архитекторам и тимлидам. Участие в курсе платное, 30 000 руб.

Хотите участвовать? Подайте заявку на участие!

Кстати, вот фотографии с прошлых Brainwashing Rails. Вы можете задать нам вопросы, пообщаться с участниками прошедших курсов на нашей странице в Facebook.

Источник: rubyflow.ru

marginalia - помощь в определении медленных запросов

37signals в очередной раз поделились с миром своим инструментом. На этот раз это небольшая библиотека, которая позволяет добавлять комментарии к логу запросов, выполняемых ActiveRecord.

Выглядит это примерно так:

Account Load (0.3ms)  SELECT `accounts`.* FROM `accounts`
WHERE `accounts`.`queenbee_id` = 1234567890
LIMIT 1
/*application:BCX,controller:project_imports,action:show*/

Зовется библиотека marginalia. Работоспособность протестирована в Rails 2.3.x и Rails 3.x.x.

Подробности об установке и использовании, а также исходный код доступены на GitHub - github.com/37signals/marginalia.

Историю возникновения marginalia можно узнать из статьи "Mini tech note: MySQL query comments in Rails".

Источник: rubyflow.ru

Rails Rumble 2012 задерживается

Команда Rails Rumble опубликовала в своем блоге сообщение о том, что состязание этого года откладывается до конца лета. Изначально событие было намечено на начало 2012, но из-за огромного количества дел, его пришло отложить.

Для тех кто не знает о том, что такое Rails Rumble. Это онлайн-состязание между разработчиками, которое проходит в течении 48 часов. Смысл в том, чтобы за ограниченное время создать интересное приложение.
Победитель получает настоящий пояс чемпиона :)

Ссылки:

Источник: rubyflow.ru

Создание и настройка рабочего окружения разработчика на Ruby и Ruby on Rails

Создание и настройка рабочего окружения разработчика на Ruby и Ruby on Rails. В этой статье мы рассмотрены:

Установка Git

Установка RVM - Ruby Version Manager для возможности работы с несколькими версиями Ruby, а также наборами библиотек Ruby - Gem’ами.

Установка собственно Ruby: Ruby 1.8.7 и Ruby 1.9.3

Установка SQLite, MySQL, PostgreSQL

Установка фреймворка Ruby on Rails 3.2 и его зависимостей

Установка Node.js как среду выполнения JavaScript

Создание нового проекта Rails

Работа с зависимостями проекта

Настройка тестового окружения и написание простых спецификаций и тестов

Написание кода приложения по спецификациям

Установка Nginx и Unicorn, и запуск приложения Rails на Unicorn и Nginx прокси

Работа с удаленным репозиторием

Работа с Continuous Integration (CI) сервером - Travis

Источник: rubyflow.ru

Вышел Ruby 1.9.3-p194

Как сообщается на официальном сайте - вышла новая версия ruby 1.9.3-p194. Нововведений нет, но исправлены некоторые ошибки и закрыта дыра в безопасности RubyGems.

Ссылки

Источник: rubyflow.ru

Вход для пользователей

Новые пользователи