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

Сервисные FormObject'ы

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

GutHub source

Пример контроллера:

def create
   @form = UserRegistrationForm.new(User.new(params[:user]))
   @form.bonus_code = 'STARS600'
   @form.submit!
end

Пример объекта:

class UserRegistrationForm < FormLogic::Base
   declare_model_name :user

   property :email, :password, :password_confirmation, to: :user

   virtual :bonus_code

   def while_validation
     if bonus_code.present? && bonus.nil?
       errors.add(:bonus_code, :invalid)
     end
   end

   def submit!
     user.transaction do
        BonusTransaction.create!
        user.create!
     end
   end

    def bonus
       @bonus ||= Bonus.registration.coded(bonus_code).first
    end
end

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

Первая онлайн-школа программирования Ruby в России

Ruby Ninja School

Мы сделали свою школу программирования, потому что стали получать запросы обучить людей Ruby из разных точек России. И изначально подход, который мы закладывали, был от простого к сложному, от практики только с самой необходимой теорией, потому что нам никогда не нравилась излишняя академичность, можно долго спорить на тему образования, базисных знаний, необходимых для начала, но лучше взять и сделать! Главный принцип нашей школы программирования: для того чтобы научиться надо много делать, а научить может только тот, кто сам много делал.

alt text

Сегодня все преподаватели проекта Ruby Ninja School – это парни, у которых за спиной сотни тысяч строчек кода, написанного для более чем 60-ти коммерческих проектов. То, чему они обучают – реально нужно для решения прикладных задач, а не для написания пузырьковой сортировки или программ по вычислению факториала.
Настоящими программистами-ниндзя становятся только те, кто хочет научиться реальному программированию, и кто готов посвятить этому своё время, поэтому наши программы составлены таким образом, чтобы домашние задания нельзя было не делать, а code review и ответы на вопросы по заданиям занимают со второго занятия около четверти времени обучения.

alt text

Сегодня Ruby Ninja School обучает около 20 студентов ежемесячно, география расположения которых простирается от Владивостока до Варшавы. Эти ребята и иногда девушки ставят перед собой различные цели: перейти на новый язык программирования, разобраться в работе своих подчинённых и понимать , что они делают, начать программировать с нуля, есть даже те, кто просто хотят сделать это своим хобби. Но всех их объединяет то, что они хотят развиваться, а не просто получать знания.

Хочешь узнать о нас подробнее? Заходи на наш сайт rubyninja.ru

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

Svitla Ruby Conference Kyiv, 31 MAY - 1 June 2014

31 мая – 1 июня 2014 года в Киеве пройдет вторая конференция RubyC, посвященная Ruby и Ruby on Rails

Посетить RubyC 2014 будет полезно тем, кто хочет:
- пообщаться с лучшими рубистами со всего мира;
- лучшие варианты практического использования Ruby на примере реальных проектов;
- услышать все о последних трендах в Ruby и Ruby on Rails;
- с пользой провести два дня среди талантливых, умных людей, набраться новых идей и почувствовать вдохновение для дальнейших достижений.

В этом году RubyC вновь собирает звездный состав докладчиков из Америки, Европы и стран СНГ. Среди приглашенных гуру: Стив Клабник (США), Бен Ловелл (Великобритания), Хавьер Рамирес (Великобритания), Александр де Оливера (Бразилия), Дэвид Хеннер (США), Джереми Эванс (США), Константин Теннахард (Германия), а также Богдан Гусев (Украина), Тимофей Цветков (Россия), Евгений Пирогов (Россия).

Подробнее о спикерах и их темах можно узнать на сайте http://rubyc.eu/. Организаторы приглашают всех желающих поделиться своим опытом и стать спикером конференции. Заявки могут быть поданы на сайте конференции. Прием заявок продолжится до конца апреля.

Полезности:
• Продажа билетов уже открыта на сайте конференции!
• Место проведения конференции: БЦ «ИНКОМ», ул. Смоленская, 31-33.
• Рабочие языки конференции – английский, русский, украинский.
• Присоединяйтесь к группам RubyC на Twitter и Facebook.

До встречи на RubyC 2014!

alt text


Впервые RubyC состоялась в 2011 году, став одним из наиболее значимых событий для руби-сообщества того года, поскольку собрало вместе не только высококлассных докладчиков из разных уголков земного шара, но и около 200 посетителей из Украины, России, Беларуси, Латвии и США . Спикерами RubyC среди прочих стали: Райан Бигг (Австралия), Стив Клабник (США), Джонас Никлас (Швеция), Дарси Лейкок (Австралия), Алексей Найден (Россия) и многие другие.

Организатор RubyC — Svitla Systems Inc., американская аутсорсинговая компания, которая занимается разработкой приложений на Ruby, .NET, PHP, Java, Magento, Flash, а также мобильных приложений. Офисы компании находятся в Киеве, Львове, Харькове, Севастополе, Черкассах, Черновцах и Тернополе. Головной офис располагается в Сан-Франциско.
http://svitla.com/

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

order_query для поиска следующих записей

order_query находит следующие и предыдущие записи ActiveRecord относительно данной.

Например, есть записи отсортированные по приоритету. Их 10,000! Если пользователь смотрит на страницу отдельной записи, хочется показать ему ссылки на следующую и предыдущую запись.

order_query позволяет эффективно получить эти записи, используя только LIMIT и WHERE, но не OFFSET:

class Post < ActiveRecord::Base
  include OrderQuery
  order_query :order_list, [
    [:pinned, [true, false]],
    [:published_at, :desc],
    [:id, :desc]
  ]
end

Теперь можем пользоваться:

# get the order object, scope default: Post.all
p = Post.find(31).order_list(Post.published) #=> OrderQuery::RelativeOrder<...>
p.before     #=> ActiveRecord::Relation<...>
p.previous   #=> Post<...>
p.position   #=> 5
p.next       #=> Post<...>
p.after      #=> ActiveRecord::Relation<...>

Секретный соус в генерируемом WHERE, который исключает все предыдущие или следующие записи:

-- post: pinned=true published_at='2014-03-21 15:01:35.064096' id=9
SELECT "posts".* FROM "posts"  WHERE
  ("posts"."pinned" = 'f' OR
   "posts"."pinned" = 't' AND (
      "posts"."published_at" < '2014-03-21 15:01:35.064096' OR
      "posts"."published_at" = '2014-03-21 15:01:35.064096' AND "posts"."id" < 9))
ORDER BY
  "posts"."pinned"='t' DESC,
  "posts"."pinned"='f' DESC, "posts"."published_at" DESC, "posts"."id" DESC
LIMIT 1

Остальное на Github.

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

Гем-хелпер для построения Slug параметров

the_string_to_slug - обеспечивает параметризацию и транслитерацию строки, помогает строить slug'и для урлов.

Все выполняется нативными средствами i18n - без полного набора средств гема russian, который как правило подключают для подобных целей

Если нужна именно генерация слагов, без других возможностей gem russian - то этот гем может оказаться кстати

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

Курс по Ruby on Rails от Злых марсиан

29, 30 марта и 1 апреля в Москве Злые марсиане проводят курс по Ruby on Rails.

В этом году мы решили полностью переработать курс, чтобы сделать его еще круче.

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

Равиль и Лёша объясняют практическое задание по Rack

На курсе мы углубляем понимание работы Rails, делимся опытом, который мы получили в крупных проектах, даем полезную выжимку знаний и развеиваем популярные заблуждения. Иными словами, за короткий срок «прокачиваем» разработчиков на Ruby on Rails, тимлидов и технических директоров Rails проектов.

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

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

Курс "Профессиональная разработка на Ruby on Rails"

Объявлен 2-й набор на курс "Профессиональная разработка на Ruby on Rails"

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

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

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

  • TDD/BDD
  • Git flow
  • написание хорошего кода
  • разработка правильной архитектуры
  • Множество стандартных и не очень gem'ов
  • Background jobs
  • REST API
  • и прочее..

Все подробности и регистрация здесь

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

Rails Expert Day

29 марта в Казани при организации Provectus пройдет конференция Rails Expert Day, посвященная разработке на Ruby.

Наши спикеры:

- Николай Рыжиков, тренер ScrumTrek

Технический лидер (художественный руководитель) команды "health samurai" (waveaccess/hospital-systems), которая уже 6 лет делает на Ruby медицинские корпоративные приложения для США. Активист питерского руби сообщества и мета-сообщества «piter-united».

Тема доклада: «Clojure для рубистов и не только»
Clojure - современный "боевой" диалект lispа, который может исполняться на JVMах & JSVMах (ClojureScript). В clojure реализованы эффективные персистентные (иммутабельные) структуры данных (vector, hash-map, list, set) и поощряется функциональное и мета-программирование.
Clojure написал один из молодых современный IT-гениев - Rich Hickey. Даже если вы не будете писать на clojure, то сможете черпать вдохновение из идей этого "мощного" человека.

В докладе помимо эмоциональных лозунгов будет предоставлено легкое введение в clojure - синтаксис (которого почти нет), макросы, экосистему, библиотеки для web разработки, основные источники информации.

- Руслан Деревякин, Java/Grails/RoR Developer в Provectus IT

Ведущий инженер с опытом разработки на Java EE, Python (Django), Grails, Ruby On Rails.

Тема доклада: «Разработка Web приложений на GRails»
Grails - фреймворк для быстрой разработки веб приложений, объединяющий в себе инфраструктуру Java EE (Sping MVC, Hibernate, Maven и т.д.) и современный подход Ruby on Rails.
В докладе будут рассмотрены особенности, преимущества и недостатки Grails в сравнении с другими популярными Web-фреймворками.

-Константин Макарычев, Full Stack Developer в Provectus IT

В Provectus IT Константин является техническим лидером в JavaScript и Objective-C разработке.

Тема доклада: «Backbone.js + Marionette.js tips & tricks»
Типичные ошибки и лучшие практики разработки сложного динамичного одностраничного интерфейса с использованием Backbone.js.
Как не перемудрить, успеть к дедлайну и выжать максимум продуктивности из данной архитектуры.

-Кирилл Мокевнин, руководитель филиала undev.ru в Ульяновске

Кирилл создает инженерную культуру компании и несет в массы XP, DDD, DevOps. Евангелист ментального программирования, Ruby ниндзя, докладчик на РИТ, devconf и других конференциях. Последние годы активно занимается обучением и немного преподаванием. Соорганизатор конференции nastachku.ru. В свободное время пишет игровую систему на erlang/js для нестандартного обучения программированию.

Тема доклада: «Архитектурные практики»
Как создавать гибкие и легко поддерживаемые приложения на rails. Поговорим об иерархии контроллеров и моделей, проектировании и версионировании api, взаимодействии с внешними сервисами, о практиках тестирования, об acl и scope policy, о репозиториях и типах. Пробежимся по нескольким очень полезным, но далеко не всем известным гемам, а так же затронем DDD, CQS и принципы ООП дизайна.

Участие бесплатное, регистрация обязательна.
Начало мероприятия: 11:00 (регистрация)
Место проведения уточняется.

Информационный партнер:

За дополнительной информацией обращайтесь:
Татьяна Козовая, PR-менеджер в Provectus IT
+38 096 237 06 46, Skype: tkozovaya

alt text

С нетерпением ждем вас на нашем мероприятии!

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

Деплой Ruby on Rails проектов через веб-интерфейс

Зачастую, перед разработчиками RoR встает необходимость централизованного деплоя приложения на продакшн сервер. Конечно, на помощь приходит мощное средство capistrano, но оно не позволяет вести историю деплоев, что бывает необходимо в командах c достаточно большим количеством разработчиков. Ниже будет рассмотрен процесс настройки веб-приложения, которое позволяет упростить эту задачу и сделать выкатку новой версии в «два клика».

Нам потребуется приложение, код которого находится на github.com. Процесс настройки capistrano опустим, в сети много примеров как это делается.

Итак, забираем код:

git clone <script type=\"text/javascript\">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%67%69%74%40%67%69%74%68%75%62%2e%63%6f%6d%22%3e%67%69%74%40%67%69%74%68%75%62%2e%63%6f%6d%3c%2f%61%3e%27%29%3b'))</script>:joelmoss/strano.git

также, можно воспользоваться форком от компании Express42, где sidekiq заменен на старый добрый resque.

Подготавливаем файл database.yml и размещаем его в директории config.
Переходим в директорию strano и запускаем script/bootstrap. Скрипт практически все сделает за нас. Скорее всего, при установке джемов могут возникнуть ошибки, связанные с отсутствием определенных хедеров в системе. В моем случае было необходимо:
1) прописать gem ‘pg’ в Gemfile, потому как использую я postgresql
2) для успешного бандлинга выполнить команду:

gem install debugger-ruby_core_source

Проверим, что все работает:

bundle exec rails s

Самое время перейти к конфигурированию нашего инструмента. Для этого скопируем файл config/strano.example.yml в config/strano.yml. Здесь нам необходимо указать всего три переменные:
1) публичный ключ машины, где мы развернули наш инструмент деплоя (public_ssh_key)
2) клиентский идентификатор приложения и его секретный ключ на github.com: github_key и github_secret соответственно.
Для получения последних двух параметров необходимо создать приложение на гитхабе, указав там домен, где будет расположен ваш веб-интерфейс.

Самым сердцем нашего инструмента будет фоновый воркер, который собственно и будет запускать все задачи. Запустим его:

bundle exec sidekiq

На этом настройка закончена. Стоит лишь сказать, что не лишним будет закрыть basic_auth`ом домен деплоилки, потому как аутентификация производится через github и мне не удалось заставить работать strano для ограничения лиц, которым приложение должно давать доступ.

Воспользоваться плодами наших трудов очень просто: для этого необходимо авторизоваться, создать проект и указать путь до репозитория. Придется подождать, пока склонируется проект и произойдет установка джемов. Далее необходимо создать нужные таски. На мой взгляд, деплой, выполнение rake тасков и выполнение кода из консоли rails — достаточный набор задач для большинства повседневных нужд.

Оригинал http://blog.rubyruby.ru/blog/2014/02/17/deploy-ruby-on_rails_via_browser/

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

spec "helper"

Замечательная статья Мэтью Паркера (Matthew Parker), Pivotal Labs, заставляющая задуматься о том, что зачастую мы используем слишком много зависимостей даже там, где они порой не нужны.

Читайте статью "Spec “Helper”" в блоге Pivotal Labs.

P.S. Так же рекомендую обратить внимание на другие статьи Мэтью - pivotallabs.com/author/mparker

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

FiniteMachine - еще одна библиотека, реализующая конечные автоматы

Я еще не проводил испытания FiniteMachine, но описание выглядит просто замечательно. Больше всего меня привлекает то, что эта библиотека имеет все необходимое для описания конечного автомата, но при этом оставляет вопрос интеграции с другими библиотеками (например, ActiveRecord) за разработчиком.

Созданный с помощью FiniteMachine автомат - это простой Ruby-объект и вы сами решаете как его интегрировать с другими классами и объектами вашего приложения.

Вот простой пример описания автомата:

fm = FiniteMachine.define do
  initial :red

  events {
    event :ready, :red    =&gt; :yellow
    event :go,    :yellow =&gt; :green
    event :stop,  :green  =&gt; :red
  }

  callbacks {
    on_enter :ready { |event| ... }
    on_enter :go    { |event| ... }
    on_enter :stop  { |event| ... }
  }
end

Вы сможете найти больше количество примеров и описание всех возможностей в README на GitHub - github.com/peter-murach/finite_machine

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

HackDay#30

С 21 по 23 февраля в пространстве DI Telegraph, пройдет HackDay#30. На HackDay участники создают работающие прототипы своих проектов и через 48 часов презентуют их коллегам, экспертам и инвесторам.

Бессменный организатор - Студия Михаила Кечинова, - привезет в Москву обновленный формат мероприятия, отработанный в городах по всей России, а также спикеров и менторов, за спиной у которых работающие технологические проекты и бесценный опыт.

К участию приглашаются программисты, менеджеры, дизайнеры, проектировщики интерфейсов, маркетологи, PR-специалисты, а также все те, у кого есть идея интернет-проекта, но нет команды для ее воплощения.

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

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

HackDay – это всегда настоящий вызов. Для людей, одержимых технологиями, мероприятие станет настоящим праздником, где они смогут воплотить в жизнь свои самые смелые идеи. Впрочем, это также и уникальный опыт общения с единомышленниками и специалистами, которые создают и развивают собственные продукты. Таким образом, каждый сможет почувствовать на себе, что значит получить свой персональный God Mode, высвободить творческий потенциал, начать двигаться в верном направлении с уже проработанной идеей. 

«Мы не занимаем время участников разговорами. Для нас важны: простота, креативность, и техническое решение. Поэтому мы ждем тех, кто действительно имеет желание и готовность разработать в течение 48 часов что-то по-настоящему интересное и при этом работоспособное. До встречи!» – Михаил Кулаков, организатор HackDay Russia.

Мероприятие условно-платное. Стоимость билета - 800 рублей, которые идут на организацию трехразового питания и кофе-брейков. Вход на демофест свободный.

  • Дата: 21-23 февраля
  • Старт: 18.00 в пятницу

  • Демофест: 21.00 в воскресенье.
  • Площадка: Рабочее пространство DI Telegraph, Тверская улица, дом 7, 5 этаж. Вход со стороны газетного переулка
  • Регистрация: http://hackday.ru/events/hackday-30
  • Организатор: Студия Михаила Кечинова
  • Контакты: 
Михаил Кулаков (менеджер проекта)
+7 (964) 329 67 71, mikhail.kulakov@mkechinov.ru
, Андрей Жеглов (работа с инфопартнерами и аккредитация прессы) +7 (965) 085 43 56, andrey.zheglov@mkechinov.ru

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

Безопасный Rails код в миграциях

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

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

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

PS. Если есть идеи как можно улучшить данный гем или другие предложения по решению данной проблемы, отписывайтесь, пожалуйста.

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

gem 'sandi_meter' – автоматическая проверка кода на правила Sandi Metz

Во время последней BaRuCo Sandi Metz сделала отличный доклад, где объяснила философию, которая стоит за Sandi Metz rules. На следующий день был выпущен гем, который сканирует код на следование этим правилам.

gem install sandi_meter

Гем можно использовать из консоли (для однократной проверки, например):

&gt; sandi_meter -p ~/path/to/project

# 1. 94% of classes are under 100 lines.
# 2. 53% of methods are under 5 lines.
# 3. 98% of methods calls accepts are less than 4 parameters.
# 4. 21% of controllers have one instance variable per action.

Так же есть HTML mode, который сохраняет все результаты в лог и рендерит красивый HTML с отчетом и статистикой по времени (для этого режима нужно использовать ключ -g):

sandi_meter -g

alt text

Ruby mode. Результат сканирования можно получить в Ruby скрипте в виде простого хэша:

require 'sandi_meter/file_scanner'
require 'pp'

scanner = SandiMeter::FileScanner.new
data = scanner.scan(PATH_TO_PROJECT)
pp data
# {:first_rule=&gt;
#   {:small_classes_amount=&gt;916,
#    :total_classes_amount=&gt;937,
#    :missindented_classes_amount=&gt;1},
#  :second_rule=&gt;
#   {:small_methods_amount=&gt;1144,
#    :total_methods_amount=&gt;1833,
#    :missindented_methods_amount=&gt;0},
#  :third_rule=&gt;{:proper_method_calls=&gt;5857, :total_method_calls=&gt;5894},
#  :fourth_rule=&gt;{:proper_controllers_amount=&gt;17, :total_controllers_amount=&gt;94}}

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

Каскадные селекты с AJAX для Rails

В этой статье можно почитать о том, как сделать каскадные селекты с подгрузкой ajax-ом.

alt text

Решение работает для rails-приложений. Описанное решение ни коим образом не претендует на открытие. Однако, наблюдая за данной проблемой от приложения к приложению, я считаю, что статья будет актуальна.

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

Benchmark Bundler

Хотите проверить сколько времени занимает загрузка каждого гема из Gemfile?

Эндрю Кейн (Andrew Kane) предлагает очень простой рецепт - перейдите в каталог вашего приложения и выполните команду:

$ curl -fsSL <a href=\"https://gist.github.com/raw/5022636/benchmark.rb\">https://gist.github.com/raw/5022636/benchmark.rb</a> | ruby

В результате вы рейтинг библиотек из Gemfile отсортированных по времени загрузки. Rails всегда занимает первое место, но всегда полезно знать и об остальных.

Результат выполнения команды выглядит примерно так:

Gem                            Time(sec)     Pct %
--------------------------------------------------
rails                             2.4161     26.9%
mongoid                           0.9279     10.3%
fog                               0.7707      8.6%
newrelic_rpm                      0.5839      6.5%
geocoder                          0.3578      4.0%
delayed_job                       0.3162      3.5%
bitly                             0.2703      3.0%
sass                              0.2651      3.0%
tire                              0.2592      2.9%
--------------------------------------------------
Total                             4.8583    100.0%

Для любознательных, кто желает узнать как все работает, вот ссылка на gist - https://gist.github.com/ankane/5022636

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

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

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