четверг, 22 сентября 2011 г.

Как дробные числа в целые превращались.

Не для кого не секрет, что математические операции с целыми числами более быстрее, чем с вещественными числами, т.е. использовать int быстрее, чем float, double и т.д.

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

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

Проще говоря: у нас есть исходное число (T = 3.5), мы выбираем минимальное число, которым будим дробить (измерять) исходное число (h=0.1). Теперь преобразуем исходное число в новое целое число, используя минимальное число (i=T/h=3.5/0.1=35).

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

Основной минус бросается в глаза сразу, если h=0.3, а T=3.5, то i = 11.666, что не соответствует тому, о чем мы говорили выше. Выбираете h, как степень 10 (10^(-1) = 0.1 и т.д.).

Вот такой интересный подход. Говорят, что это позволило избавиться от многих ошибок с округлением. =)

Спасибо за внимание. 

среда, 21 сентября 2011 г.

Возвращение из отпуска

Привет, друзья.

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

Политика публикаций не изменится: 2 сообщения в неделю =)
Формат постов также не должна изменится: буду пытаться кратко и по делу рассказать о затронутой теме.

Всегда приветствуются ваши комментарии. Пишите.

До встречи.
Удачи. 

четверг, 11 августа 2011 г.

Делегирование в RubyOnRails (method delegate in RubyOnRails)


Всем привет!

Сегодня расскажу про метод delegate в RubyOnRails.

Его назначение: позволяет вызывать методы других объектов как свои собственные.

Использовать его просто:
delegate [один или несколько методов], to: => [целевой класс]

[один или несколько методов] - названия методов из целевого класса.
Имена методов записываются как символы или как строки. Несколько методов разделяются запятой.
Пример: :hello, :goodbye, :start, :end
[целевой класс] - название имени класса в который будут делегироваться запросы на вызов метода.
Пример кода:
Есть класс Greeter
class Greeter < ActiveRecord::Base
    def hello()   "hello"   end
    def goodbye() "goodbye" end
  end

Мы хотим в классе Foo делегировать вызов метода hello классу Greeter
  class Foo < ActiveRecord::Base
    belongs_to :greeter
    delegate :hello, :to => :greeter
  end

Тогда вызывая у объекта класса Foo метод hello получим:
  Foo.new.hello   # => "hello"

Если попытаемся вызвать другой метод класса Greeter - goodbye, то получим ошибку.
  Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
Это только один из способов использования delegate.
Спасибо за внимание.
Удачи.

четверг, 28 июля 2011 г.

Термин "Утиная Типизация" (Duck Typing)

Привет.

Сегодня немного расскажу о понятии "утиная типизация" или просто "утипизация" в Ruby. Ссылка на wiki-ru и wiki-eng.
Термин принадлежит Дейву Томасу (Dave Thomas) и восходит к поговорке: если что-то выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка. (If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck.).
Точный смысл термина "утипизация" - тема для отдельных дискуссий, скорее всего это намек на тенденцию Ruby заботиться не сколько о точном классе объекта, сколько о том, какие методы для него можно вызвать и какие операции над ним можно выполнять. Таким образом, обычным делом становится просто передать объект методу, зная, что при неправильном использовании будет выброшено исключение (exception).
Утиная типизация решает некоторые проблемы иерархической типизации:
  • невозможность явно указать (путем наследования) на совместимость интерфейса со всеми настоящими и будущими интерфейсами, с которыми он идейно совместим;
  • экспоненциальное увеличение числа связей в иерархии типов.

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

Как-то так. Всем спасибо за внимание.
До встречи.

пятница, 22 июля 2011 г.

Мысли об эталонной реализации.

Всем привет!

Первым делом конечно Wiki

А теперь мои мысли.

На днях сталкнулся с таким понятием как эталонной реализацией (от англ. reference implementation). Первый мысли были, что это какая-то абстрактная модель для построения всего и все. А вот и нет, оказалось, что за термином кроется реализация программного обеспечения, полностью соответствующая спецификации, либо демонстрация спецификации в действии.

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

Характеристики эталонной реализации:
  1. Разработана одновременно со спецификацией и тестовым пакетом; 
  2. Демонстрирует, что спецификация реализуема; 
  3. Служит образцом при тестировании других реализаций тестовым пакетом; 
  4. Служит «Золотым стандартом» при измерении других реализаций; 
  5. Улучшает наглядность спецификации, когда специально подготовленные тесты не подходят.
Таким образом можно прийти к выводу какой большой и тернистый путь должна пройти спецификация, что бы материализоваться и стать либо полноценной библиотекой либо новой веткой развития языка программирования.

вторник, 5 июля 2011 г.

Как проверить существование в хэше ключа (Ruby).

Привет.

Нам нужно быстро выполнить следующие действия.
Пусть есть  хэши:
hash1 = {:text => 'redf', :subtext => 'Her' }
hash2 = {:text => 'yels' }
Очется однобразно работать с этими хэшами, но в одном есть ключ subtext, а в другом нет.
Что делать?
Нужно проверить, есть ли нужный ключ в хэше и если он есть получить значение по этому ключу.
Это можно сделать используя try.
hash.try(:[], :subtext)
Если у hash есть ключ subtext, то получим значение по ключу, если ключа нет, то nil.
hash1.try(:[], :subtext) # Her
hash2.try(:[], :subtext) # nil

Вот так вот просто это делается в Ruby =)

Пока!!!