четверг, 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 =)

Пока!!!

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

Rails и Heroku.

Привет.

Облачные технологии приходят на помощь всем.
Для разработчиков Ruby on Rails (RoR) есть такой сервис как Heroku. Heroku это PaaS.

Для чего он нужен?
В идеале данный сервис должен упростит процесс разработки и запуска проектов, использующих Ruby on Rails.

Что предлагает Heroku?
Первое предложение заключается в том, что предоставляется среда разработки проектов на RoR, для работы с которой вам понадобится лишь браузер.  Это избавляет от необходимости использования сторонних программных продуктов, предназначенных для программирования на RoR. Плюс этого в том, что в сравнении с другими языками, ограничения, накладываемые Ruby и RoR, могут быть сложнее, чем просто установка и настройка, использование предоставляемой среды разработки утраняет эти ограничения. Heroku хотят предоставить, как профессионалам, так и новичкам, возможность беспроблемной разработки с использованием лишь ПК с браузером.

Второе предложение Heroku позволяет разработчикам размещать (host) их, а так же масштабировать (scale). Heroku использует Amazon Web Services для масштабирования проектов размещающихся у них, и планируют в качестве дополнительной возможности взымать плату за кол-во потребляемых мощностей с платных пользователей, использующих данную услугу. Даже, если вы не желаете разрабатывать свое приложение с использованием Heroku, вы можете просто импортировать ваше приложение, чтобы ощутить всю мощь автоматической масштабируемости, предоставляемой этим сервисом.

Пробуйте.

Удачных выходных.

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

Как запомнить SQL JOINS.

Всем привет!

Для тех, кто забыл, а может и не знал как быстро запомнить различные JOIN, на помощь приходит вот такие картинки.
Источник




Все. =)
Удачи.

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

Типичный рабочий процесс при работе с SVN.


Привет.

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

В документации по SVN представлен вот такой типичный рабочий процесс (Basic Work Cycle):
  1. Обновляем свою рабочую копию проекта.
    • svn update
  2. Добавляем свои изменения.
    • svn add
    • svn delete
    • svn copy
    • svn move
  3. Проверяем добавленные изменения на корректность.
    • svn status
    • svn diff
  4. Возможно отменяем некоторые изменения.
    • svn revert
  5. Устраняем (резолвим) конфликты / применяем (мержим) изменения от других.
    • svn update
    • svn resolve
  6. Коммитем свои изменения.
    • svn commit
    Это можно взять за основу своего рабочего процесса работы с системой контроля версии.

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

    вторник, 31 мая 2011 г.

    Немного про array и метод map в Ruby

    В Ruby как и в других языках программирования есть массивы - класс Array.
    Этот класс (Array) имеет много методов для работы с массивами раскажу об одном из этих методов map.
    Поясню на примере:
    Пусть есть массив arr1 = [4, 5, 6]
    Мы можем создать новый массив arr2 на основе массива arr1 используя map.
    arr2 = arr1.map { |a| a+6 } # [10, 11, 12]
    Но есть особенность, мы хотим преобразовывать массив arr1 только для определенных элементов.
    Например вот так: arr2 = arr1.map { |a| a+6 if (a > 4) } # [nil, 11, 12]
    Как видно, если условие не выполнилось, то в новом массиве arr2 будут элементы nil. Для того, чтобы их не было можно воспользоваться методом compact.
    arr2 = arr1.map { |a| a+6 if (a > 4) }.compact # [11, 12]
    Во всех приведенных примерах методы map и compact создают ноые массивы.
    Кто хочет может подумать, как оптимизировать работу с памятью.

    Всем удачи.