Персональный блог Ruslan Voloshin

Как получить список включенных модулей в класс, и дерево наследования

  •  
April 06, 2012 20:502 коммент.
module SomeModule
end

class ParentModel < Object
  include SomeModule
end

class ChildModel < ParentModel
end

p ChildModel.included_modules #=> [SomeModule]
p ChildModel.included_modules(false) #=> []

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel]

Какое отличие между include и extend в Ruby?

  •  
April 06, 2012 20:230 коммент.

include: расширяем метод эксземпляра класса

extend: расширяет методы класса 

module ReusableModule
  def module_method
    puts "Module Method: Hi there!"
  end
end

class ClassThatIncludes
  include ReusableModule
end
class ClassThatExtends
  extend ReusableModule
end

puts "Include"
ClassThatIncludes.new.module_method       # "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method              # "Module Method: Hi there!"

 

Как Ruby поможет управлять виртуальными машинами.

  •  
March 31, 2012 22:370 коммент.

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

И так воможно ктото слышал о разных системах виртуализации и VPs - и так есть около 8 обще известных систем

И самое интересное что есть одна библиотека которая позволяет управлять ими, и к нашему с вами счастью у нее есть руби обертка с джемом ruby-libvirt. 

И так что можно сделать с вашей виртуальной машиной без перезагрузки - добавлять логические диски, создавать Logical volume and group,  сетевые устройства, монтировать флешки и сидиромы, так что если супорт говорит что есть необзодимость преегрузить вашу машину - тем самым сделать простой для ваший сайтов, просите сделать это без перезагрузки. 

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

Так что если кого заинтересовало можете фокнуть и посмотреть.  

Кроссбраузерность/iframe и full screen

  •  
March 31, 2012 14:560 коммент.

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

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

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

Я нашел довольно хорошее решение - использовать ифрейм, но как же суметь раскрыть ифрейм на все окно при клике внутри на какойто объект? 

Было перепроовано много варивантов, и самы работоспособный оказался window.postMessage 

Дальеш приведу простой пример с исходного кода, который не претендует на самый лучший вариант, но по крайней мере работает.

 

Функция для ифрейма

function resizeFrame(full) {

  parent.postMessage(full == true ? 'full_screen' : 'inplace_screen', '*');

  if (full == true) {

    $('.wblock').hide();

  } else {

    $('.wblock').show();

  }

}

 

Дальше код который будет вставляться в родительское окно.

 

    if(typeof window.addEventListener != 'undefined') {

    //alert('add addEventListener');

      window.addEventListener('message', resize_message, false);

    }

    else if(typeof window.attachEvent != 'undefined') {

    //alert('add attachEvent');

      window.attachEvent('onmessage', resize_message);

    }

 

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

 

Что нам дает использование ифрейма

   - отсутствие проблемм с скроссайтовыми запросами, 

  - отсутствие переопределения CSS 

  - не пепесекаются яваскриптовые библиотеки

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

 

 

 

git - precommit hook

  •  
November 23, 2011 14:481 коммент.

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

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

 

vi .git/hooks/pre-commit 

#!/bin/sh
git diff --cached --name-status | grep -E '\.(rb|rake)$'  | while read st file; do
# skip deleted files
  if [ "$st" == 'D' ]; then continue; fi

  if ! ruby -c "$file" >/dev/null; then
#   echo "Ruby syntax check failed for file: $file"
    exit 1
  fi
done

chmod +x .git/hooks/pre-commit 
 
Так же можно заставить запускать насильно всех тесты перед комитами.