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

Пока!!!

пятница, 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 создают ноые массивы.
    Кто хочет может подумать, как оптимизировать работу с памятью.

    Всем удачи.

    пятница, 27 мая 2011 г.

    Ключевые слова и идентификаторы в Ruby

    Привет. Вот и пятница.

    Сегодня в России официально начались продажи iPad2 =)

    Но ... Приступим.

    Ключевые (или зарезервированные) слова в Ruby обычно не применяются ни для каких иных целей. Вот их полный перечень, наверное =):
    • BEGIN 
    • END
    • alias
    • and
    • begin
    • break
    • case
    • class
    • def
    • defined?
    • do
    • else
    • elsif
    • end
    • ensure
    • false
    • for
    • if
    • in
    • module
    • next
    • nil
    • not
    • or
    • redo
    • rescue
    • retry-
    • return
    • self
    • super
    • then
    • true
    • undef
    • unless
    • until
    • when
    • while
    • yield
    Имена переменных и других идентификаторов обычно начинаются с букв или специального модификатора. Основные правила таковы:
    • имена локальных переменных (и таких псевдопеременных, как self и nil начинаются со строчной буквы или знака подчеркивания _;
    • имена глобальных переменных начинаются со знака доллара $;
    • имена переменных экземпляра (принадлежащих инстанцированному объекту)  начинаются с знака «собачки» @;
    • имена переменных класса (принадлежащих классу) предваряются двум: знаками @ (@@);
    • имена констант начинаются с прописной буквы;
    • в именах идентификаторов знак подчеркивания _ можно использовать наравне со строчными буквами;
    • имена специальных переменных, начинающиеся со знака доллара (например, $1 и $/), здесь не рассматриваются.
    Приведу некоторые примеры:
    • локальные переменные alpha, _ident, some_var;
    • псевдопеременные self, nil,__file__;
    • константы K6chip, Length, LENGTH;
    • переменные экземпляра @foobar, @thxll38, @not_const; 
    • переменные класса @@phydeaux, @@my_var, @@nOT_const;
    • глобальные переменные $beta, $B12vitamin, $not_CONst.
    На этом все.
    Удачи.

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

    Концепция баррикады

    Всем доброго вторника!

    Захотелось поговорить о чем-то высоком, для этого блога это значит о проектировании и архитектуре ПО =)

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

    Суть концепции заключается в следующем:
    Все окружение программы разделяется на два - кому можно доверять (ближний круг) и кому нет (дальний круг).

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

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

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

    Часть сущностей (назовем их «забаррикадные») — живут в активной и агрессивной среде, взаимодействуют с внешним миром, вызываются сторонними классами и им может быть передана любая чушь. Начинаться они должны со всех необходимых проверок и никому не доверять. Невалидность входных данных должна рассматриваться как штатный режим работы. Он не должен валить программу. В зависимости от принятой в проекте идеологии, при приходе невалидных данных можно написать сообщение в лог, выдать сообщение пользователю или вообще молча исправить данные на валидные и продолжить работу.

    Следующая группа объектов — это сама «баррикада». Роль баррикады — гарантировать всем, кто находится внутри безопасность. Ничто не должно проникнуть внутрь баррикады непроверенным, несконвертированным во внутренние форматы, невалидным и т.д. Сюда входят разнообразные конверторы, валидаторы, вропперы и прочие аналогичные вещи.

    И последняя часть концепции — это «внутрибаррикадные» жители. Они и есть тем, ради чего вся эта затея начиналась. Метод, находящийся внутри баррикады может не проверять входные параметры или текущее состояние объекта, к которому он принадлежит! За него это уже гарантированно сделала баррикада. Во всех внутрибаррикадных методах обязаны стоять ASSERTы, поскольку невалидность чего-нибудь является уже не проблемой взаимодействия с внешней средой, а конкретной ошибкой в баррикаде. Её в дебаг-версии нужно обнаружить и исправить. А в релизе ASSERTы будут выброшены компилятором и не будут никому мешать.

    Конечно, в баррикадах есть недостатки — нужно чётко разграничивать вещи относительно баррикады по уровням доверия к ним, проверки внутри баррикады все-равно иногда нужны (ASSERTы), хоть их и значительно меньше. Всё это решает где-то полторы-две из трех описанных в начале статьи проблем, так что иногда может пригодиться.

    Вот такая вот концепция.

    Всем удачной недели.

    пятница, 20 мая 2011 г.

    Магические имена в Rails.

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

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

    В Ruby on Rails есть список магических слов (Magic Field Names), которые используются системой для определенных нужд. Использование таких же названий может привести к проблемам вида WARNING: Can't mass-assign protected attributes: type.

    Вот список этих зарезервированных слов и имен (List of Magic Field Names):
    • created_at
    • created_on
    • updated_at
    • updated_on
    • lock_version
    • type
    • id
    • #{table_name}_count
    • position
    • parent_id
    • lft
    • rgt
    • quote_value (is used for quoting)
    • template
    На этом все.
    Желаю всем приятных выходных.
    Удачи.

    понедельник, 16 мая 2011 г.

    Кое-что о Garbage Collector в Ruby

    Garbage Collection (GC) в Ruby отличается от сборщиков мусора в Java, C# и некоторых других языков программирования. И отличает его то, что в Ruby GC не generational, т.е. non-generational. Это значит, что GC в Ruby не делит объекты на поколения. Суть использование «поколений объектов» (GC в Java, к примеру) сводится к тому, что вновь созданные объекты гораздо чаще становятся недостижимыми, чем те объекты, время жизни которых велико (поколений объектов - штука сама по себе не простая). Соответственно, GC, который учитывает поколения, сильно сокращает время выполнения сборки мусора, посколько количество просматриваемых объектов в ходе сборки не так уж и велико, поскольку сборщик обращает внимание только на «молодое» поколение, будучи уверенный в том, что остальные поколения он на славу почистил (существуют и другие поведенческие модели, но эта — основная). Такое деление на поколения и называется generational GC. Таким образом, GC в Ruby очень дорогая операция, потому что ему приходится просматривать все объекты в памяти, каждый раз, когда GC будет вызван.

    В Ruby интересная модель управления памятью (How Ruby Manages Memory and Garbage Collection).


    На этом все.
    Удачной недели.


    четверг, 12 мая 2011 г.

    Технология cookie. Недостатки.

    Cookie, на русском говорят куки.
    Для начала вот какое определение. 
    Куки (от англ. cookie — печенье) — небольшой фрагмент данных, созданный веб-сервером или веб-страницей и хранимый на компьютере пользователя в виде файла, который веб-клиент (обычно веб-браузер) каждый раз пересылает веб-серверу в HTTP-запросе при попытке открыть страницу соответствующего сайта. Применяется для сохранения данных на стороне пользователя, на практике обычно используется для:
    - аутентификации пользователя;
    - хранения персональных предпочтений и настроек пользователя;
    - отслеживания состояния сессии доступа пользователя;
    - ведения статистики о пользователях.

    Это wiki_ru или можно на wiki_eng.

    При всей универсальности файлов cookie (они поддерживаются производителями браузеров с незапамятных времен), им присущи серьезные (с современной точки зрения) недостатки:
    - ограниченный, и очень маленький размер файлов. Обычно не более 4 Кбайт;
    - передача от браузера к серверу и обратно при каждом запросе;
    - проблем конфиденциальности;
    - технические недостатки. В частности, они не всегда точно идентифицируют пользователя и
      могут быть причиной атак злоумышленников;
    - если на компьютере используется более одного браузера, то, как правило, каждый имеет 
      отдельное хранилище для куки;
    - каждый сайт должен иметь свои собственные куки;
    - злоумышленник может изменить содержимое куки перед отправкой;
    - куки могут вызвать противоречия между клиентом и сервером.

    Можно отметить, что как развитие технологии cookie, обычно рассматривают Web Storage.

    Возвращение и обращение к читателям.

    Всем, Привет!
    Я вернулся. Прошел целый месяц, но время не прошло зря. Благодоря вашим отзывам и рекомендация от друзей сложилось более понимающее отношение к ведению блога.

    Кратко о том, что вас ждет.

    Во-первых про сами статьи.
    Статьи будут представлять собой описание чего-либо или решение какой-либо проблемы.
    Постораюсь быть как можно информативнее и кратким.

    Во-вторых про переодичность.
    Статьи будут выходить два раза в неделю. Скорее всего дни следующие: 1 раз - понедельник или вторник, 2 раз - четверг или пятница.

    Спасибо. До новых встреч.

    четверг, 31 марта 2011 г.

    Преобразование наборов символов и файловых форматов

    Конвертировать файл текстового формата из MSDOS в UNIX формат (разница в символах возврата каретки):

    dos2unix filedos.txt fileunix.txt

    Конвертировать файл текстового формата из MSDOSUNIX в MSDOSMSDOS формат (разница в символах возврата каретки):

    unix2dos fileunix.txt filedos.txt

    Конвертировать содержимое тестового файла page.txt в html-файл page.html:

    recode ..HTML < page.txt > page.html

    Вывести список доступных форматов:

    recode -l | more

    среда, 30 марта 2011 г.

    Как создать символьную ссылку (symbolic link) в *nix.


    Символьная ссылка (symbolic link) это что-то вроде ярлыка.


    Для того, что бы ее создать испрльзуют команду ln:
    ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]


    Для примера:
    ln -s /usr/local/apache/log ./logs


    Это команда создаст в текущем каталоге символьную ссылку с названием logs, которая указывает (содержит) на /urs/local/apache/logs.

    Серверный JavaSсriрt: движки


    Здравствуйте.

    Сегодня поделюсь информацией про использование JavaScript (JS) на серверной стороне. Многие считают, что использовать JS не только для клиентской части, но и на серверной стороне это хорошо и даже приятно.

    Опустим рассказ о плюсах и минусах использования JS на серверной стороне и зададимся другим вопросом. Другой вопрос — Каким образом возможно осуществить использование серверного JS?
    Сегодня есть четыре основных движка, которые используются на серверах.


    Rhino — движок от компании Mozilla, написанный на Java и поддерживающий последнюю 1.7 версию стандарта JS, который к тому же дополняет язык собственными расширениями и объектами. Основным преимуществом движка является работа поверх стандартной JVM, а значит, его можно использовать в любой среде, где работает Java. Другими словами, можно применять современные веб-серверы типа jetty, но при этом писать на любимом JS. Кстати, Rhino применяют на облачном хостинге от Google! А вот с производительностью сложнее. Она зависит, с одной стороны, от движка и применяемых там технологий, вроде JIT-компиляции, и от работы самой Java-машины. Кстати, многие тестеры, которые говорят, что Rhino очень медленный, забывают, что движок имеет два режима работы: интерпретации, когда скрипт каждый раз преобразуется в Java байт-код (аналогично PHP), и компиляции, когда такое преобразование происходит только раз, а потом многократно исполняется. Первый режим выгоден, когда ты отлаживаешь код, который меняется каждую минуту, второй больше подходит для рабочей версии проекта, работающей под нагрузкой.



    SpiderMonkey — еще один движок от Mozilla, на этот раз на C. Кстати, это вообще первый в мире движок JS, написанный еще в Netscape — сегодня он открыт и используется в таких популярных продуктах как Firefox, Adobe Acrobat и даже в одном из эмуляторов серверов онлайн-игры Ultima Online. Далее разработчики сильно модифицировали его, добавив компиляцию JS напрямую в ассемблерный код, и переименовали в TraceMonkey — именно этот движок используется в ветке 3.6 Firefox’а. В основном SpiderMonkey используют в ПО, которое написано на С/С++ и нуждается в скриптовом языке. Из известных продуктов: Comet-сервер APE, noSQL БД CouchDB, серверная платформа Jaxer и модуль к Apache mod_js.


    Futhark

    Futhark — это движок от Opera, который базируется на движке Presto. Кроме браузера, Futhark используется в их инновационном сервисе Unite (типа встроенный сервер в каждом браузере), а также на их серверах, обслуживающих мобильный браузер Opera Mini. Жаль, что движок закрыт, и его пока нигде за пределами самой Opera не применяют.
    Opera Carakan - еще один движок от Opera. Краткое описание движка.


    V8 — движок от Google, который используется в Chrome и является основой будущей Chrome OS. Сегодня это самый крутой, быстрый и мощный движок, в котором JS-код напрямую преобразуется в ассемблер целевого процессора, что позволяет обойти по скорости все остальные движки. Кроме этого гугловцы используют множество ухищрений для оптимизации, хранят в памяти скомпилированный код, оптимизируют его на лету (например, удаляют блоки кода, которые по решению компилятора вообще не могут быть задействованы, и т.п.). На базе этого движка построена самая популярная и быстроразвивающаяся серверная платформа — Node.JS


    На этом краткий обзор закончен. Если есть чего добавить, пишите, буду рад.
    Всем удачи.

    четверг, 24 марта 2011 г.

    Мобильная вирусология, последнии тенденции.

    Основные тенденции в мобильной вирусооголии:

    Во-первых, ОС Android уверенно завоевывает популярность. Операционные системы iOS и Blackberry также увеличили свое присутствие на рынке, а вот Symbian продолжает терять позиции, хотя в мировом масштабе по-прежнему остается лидером.

    Во-вторых, список платформ, для которых зафиксированы вредоносные программы, расширился. Теперь к ним добавились iOS (операционная система для iPhone/iPod Touch/iPad) и Android. Появившиеся зловреды для iOS, способны заразить только «разлоченные» (jailbroken) смартфоны.

    В-третьих, вредоносные программы и атаки в целом становятся более сложными.

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

    Могут ли электронные документы служить доказательством в суде?

    Документы, полученные посредством факсимильной, электронной или иной связи, документы, подписанные электронной цифровой подписью (ЭЦП) или другим аналогом собственноручной подписи, относятся к письменным доказательствам. Об этом говорится в ч. 3 ст. 75 АПК РФ.В соответствии с Гражданским кодексом РФ и Федеральным законом «Об информации, информатизации и защите информации», ЭЦП можно использовать для удостоверения электронных документов, а бумажные копии таких документов имеют юридическую силу подлинника. В определенных случаях электронные документы могут выступать и как вещественные доказательства.

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

    В любом случае всю деловую переписку с партнерами и клиентами (в том числе по электронной почте) лучше тщательно хранить.

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

    Ставим PostgreSQL 9.0 на Ubuntu 10.04

    Релиз PostgreSQL 9.0  был 2010/09/20. В репозитории Ubuntu Lucid apt  имеется пока только версия 8.4. Maintainer Martin Pitt не добавил пакет  postgresql-9.0 (won’t be added until Ubuntu Natty). Однако мы можем установит пакет postgresql-9.0 из backports repo for Ubuntu.

    Неоходимо сделать следующие шаги:


    1. Добавить путь к backports repo
    sudo add-apt-repository ppa:pitti/postgresql

    2. (Обновить) Update apt
    sudo apt-get update


    3. Jason Froebe писал, что если у вас стоит более раняя версия PostgreSQL, то вы можете сделать upgrade


    sudo apt-get upgrade

    4. Ставим пакет postgresql-9.0
    sudo apt-get install postgresql-9.0 libpq-dev



    Замечание про пакет libpq-dev.
    Пакет libpq-dev используется взамен libpq, нужен для компиляции wrappers/clients.



    Замечания про пути.
    По-умолчанию config директория: /etc/postgresql/9.0/main
    По-умолчанию data директория: /var/lib/postgresql/9.0/main

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

    NoSQL Databases: Why, what and when from Lorenzo Alberton

    Интересная презентация про не SQL. Новые решения старых проблем.
    Узнаете кратко и по делу про такое как:
    • ASID
    • MVCC
    • Distributed Transactions
    • пару слов про Amazon Dynamo Paper
    • и многое другое

    Интересно, но много =)

    понедельник, 28 февраля 2011 г.

    Анонс Ruby Coding Conventions

    JVM and Permanent generation

    О чем речь

    Бывает, что выделяешь JVM много оперативной памяти, она тебе все равно падает. И пишет, что переполнение.
    Все становится ясно, когда смотришь в профайл и видишь, что во всем виноват Permanent Generation (PG).

    Пару слов о PG.

    Permanent Generation используется JVM для хранения служебных данных, в том числе метаданные о созданных объектах и т.д. При каждом создании объекта JVM будет сохранять связанный с ним набор данных в PG. Соответственно, чем больше вы создаете объектов разных типов, тем больше пространства требуется в PG.

    Как задать размер PG.

    Размер PG можно задать двумя параметрами JVM:
    -XX:PermSize – задаёт минимальный, или изначальный, размер PG, и -XX:MaxPermSize – задаёт максимальный размер.
    При запуске больших Java-приложений лучше задать значения для этих параметров одинаковыми, так что PG создаётся сразу с максимальным размером, что может увеличить производительность, так как изменение размера PG – дорогостоящая (трудоёмкая) операция. Определение одинаковых значений для этих двух параметров может избавить JVM от выполнения дополнительных операций, таких как проверки необходимости изменения размера PG и, естественно, непосредственного изменения.

    Доп. ссылки

    про сборку муссора в Hotspot JVM
    FAQ o PG в Hotspot JVM
    Модель памяти в виртуальной Java-машине: Permanent Generation


    четверг, 24 февраля 2011 г.

    понедельник, 14 февраля 2011 г.

    Если у вас undefined method `total_pages'.

    Опишем ситуацию в общем виде:
    Хотим сделать запрос к базе, получить данные и отсортировать их по определенному атрибуту.
    Все идет хорошо и вдруг возникает ОШИБКА вида:
    ActionView::TemplateError (undefined method `total_pages' for #<Array:0x5e82358>)

    Это связано с испоьзованием:
    escape_javascript will_paginate @transactions
    и
    @transactions = @transactions.sort_by { |transaction| transaction.name }

    Проблема кроется в том, что Array не имеет метода total_pages.


    Для того, что бы все было хорошо делаем так:
    @transactions.sort! { |a,b| a.name <=> b.name }

    И все работает. Спасибо ресурсу, а также.

    понедельник, 31 января 2011 г.

    JQuery plug-in DataTables


    Очень интересный плагин на основе javascript библиотеки jQuery.
    Что он позволяет делать:
    Без особых трудностей (это конечно зависит от опыта) превратить обычную таблицу HTML в продвинутую интерактивную таблицу.
    Дополнительные плагины, которые также присутствуют на сайте. Позволяют изменением в одном парраметре добавить пейджинг, сортировку, количество отображаемых данных и многое другое. Поддерживает несколько источников для получения данных. Например: взаимодействие с сервером происходит с использованием Ajax. Формат обмена данными: JSON. Парсер уже встроен, что иногда вызывает проблемы, так как вся вложенность будет автоматически представлена строкой в ячейки массива. Ну это так, я плачусь =)
    Это только малость всех возможностей...

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

    Ссылка на DataTables

    Всем желаю удачи.

    четверг, 27 января 2011 г.

    Для затравки. О проблемах с Single Table Inheritance.

    Описание проблемы: Имеем разные SQL запросы для одного и того же ruby кода. Т.е. один и тотже код исполняется по разному.

    Более подробнее поговорю об этом потом, а пока как решается проблема.

    Глубокая статья о трудной жизни. (Ценное в комментариях)
    When Rails Needs a Clue - Single Table Inheritance Problems

    Ну и по этой теме.
    When single-table inheritance attacks
    Three Reasons Why You Shouldn't Use Single Table Inheritance
    Problem with one-to-many relationship with Single Table Inheritance (Rails)
    require_dependency

    среда, 26 января 2011 г.

    Web. Мы похоже, но все же мы разные.

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

    Предположим такую ситуацию. Имеется возможность выбрать несколько значений, скажем, для фильтрации.
    Пояснение:
    Когда мы обращаемся к странице, мы не пишем параметры, т.е. никто сам не напишет: http://www.blogger.com/post?blogID=48276.

    Так вот, мы вызываем первый раз страницу (параметров нет) и по умолчанию должны быть выбраны все значения в фильтре. Когда мы выбираем элемент в фильтре его значение передается в запросе на сервер и можно понять, что вернуть клиенту. Теперь пусть не один элемент не выбран на сервер в этом случае пойдет запрос без параметров, что похоже на загрузку первый раз и схоже, что выбраны все значения.

    На этот случай в web-е есть прием которому лет 100. =)

    Создаем скрытый элемент input: <INPUT TYPE=HIDDEN NAME=customerid VALUE="c2415-345-8563">

    Пусть по умолчанию у него значение false: <input type=hidden name='deselect-all' value='false'>
    Когда не один элемент фильтра не выбран при помощи javascript-a устанавливаем значение true. Включаем это поле в качестве параметра при отсылки запроса на сервер. Когда какой-то элементы фильтра выбран при помощи javascript-a устанавливаем значение false.
    Вот и все решение. Если подумать головой, можно найти достойное применение этому методу.
    Всего хорошего.

    суббота, 22 января 2011 г.

    JQuery. Отмена действия по умолчанию для событий.

    Нужно отменить действие браузера по умолчанию для события.
    Когда долго этим не пользуешься забываешь, а решение простое нужно вернуть значение false из функции обработчика, это также предотвратить «всплывание» события (т.е. передачу события от одного элемента другому).

    Пару примеров на JQuery для события submit:

    Чтобы отменить действие по умолчанию и предотвратить «всплывание», возвращаем false:
      JQuery("form").submit(function(event) {
          return false;
      });
    или

      JQuery("form").bind("submit", function(event) { return false; });

    Чтобы отменить только действие по умолчанию используется метод preventDefault.
       JQuery("form").bind("submit", function(event) {
            event.preventDefault();
       });

    пятница, 21 января 2011 г.

    Формат чисел в разных странах.

    Как записать число один миллион двести пятьдесят тысяч?
    По записи числа некоторые могу сказать, сто вы затряли в застрял в американо-ориентированных рамках сознания (US-centric frame of mind). В мире не все в одном формате записывают числа.
    Для примера.
    Число: один миллион двести пятьдесят тысяч пятьсот и семьдесят пять сотых.
    В разных странах будет выглядеть так:
    В США:          1,250,500.75
    В Германии: 1.250.500,75
    Во Франции: 1 250 500,75
    В Швецарии: 1'250'500.75
    А в Японии:  125,0500.75

    Радует одно, что в конце точка есть везде =)

    четверг, 20 января 2011 г.

    Время, контроль и управление. RescueTime.

    Куда "уходит" ваше время? Чтобы понять это можно воспользоваться инструментом RescueTime

    RescueTime  это web-ориентированный инструмент управления и анализа времени. Позволяет работать более эффективнее и продуктивнее.

    Дополнительная информация на видео.




    RescueTime Time Tracking Overview from Tony Wright on Vimeo.

    Тур по продукту, возможности, назначение: RescueTime Product Tour

    среда, 19 января 2011 г.

    Новости с полей. Accordion

    Есть такой JQuery UI плагин Accordion. Он позволяет создавать раскрывающиеся и закрывающиеся по клику меню.
    Смотрим демо: Demo

    Ссылки по теме:
    http://plugins.jquery.com/project/accordion
    http://www.linkexchanger.su/2009/93.html
    http://docs.jquery.com/UI/Accordion

    Исключения и принцип Let it crash (fail).

    Навеяно эрлангом и множеством непонятных исключений.
    А как правильно?
    Умные люди говорят так:
    Очень частый паттерн использования исключений — открываем ресурс, пробуем его обработать, ловим исключение, закрываем ресурс и кидаем его дальше. Принцип let it fail автоматизирует этот процесс, выкидывая из него синтаксический мусор.

    Спасибо Михаилу за feedback. Учитывая его замечания.

    Все остальное читаем: http://habrahabr.ru/blogs/erlang/112110/

    Знакомтесь Redmine

    Сайт проекта: http://www.redmine.org/
    Там можно скачать систему, почитать документацию и т.д.

    Что такое Redmine?


    Redmine это гибкая система управления проектами в виде web-приложения. Устанавливается на сервере и доступно, через окно браузера. Redmine написан с использованием фреймфорка Ruby on Rails. Эта системя является кросплатформенной "cross-platform" (может инсталированться на разные ОС) и кросбазовая "cross-database" (может инсталироваться под разными базами данных).

    Кроме того Redmine открытое ПО с доступным исходным кодом, которое распространяется под лицензией GNU General Public License v2 (GPLv2).

    Основные возможности

    Перечислим некоторые из основных возможностей Redmine:
    • Поддержка множества проектов;
    • Гибкая работа с ролями в системе доступа;
    • Гибкая система управления задачами;
    • Наличие диаграммы Ганта и календаря;
    • Поддержка системы новостей, управление документами и файлами;
    • Наличие различных систем напоминания;
    • Ведение wiki под проект;
    • Ведение форумов под проект;
    • Система контроля времени исполнения задач;
    • Настраиваемые поля для задач, временных меток, проектов и пользователей;
    • Интергация с различными системами контроля версий (SVN, CVS, Git, Mercurial, Bazaar and Darcs)
    • Создание заданий через email;
    • и т.д.
     
    Пример развернутой системы Redmine можно посмотреть здесь: http://demo.redmine.org/.

    Всего хорошего.

    Фэйл

    Сегодня речь пойдет про то, что значит быть профессионалом и отношение к разработке.

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

    На примере "простого" задания рассмотрим все эти этапы.

    Предположим ставится задача сделать экспорт данных в web-приложении. Требования к задаче: необходимо сделать экспорт данных для выбранной страницы (для профи это уже первый звоночек). Нужно сделать быстро. Все больше требований нет.

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

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

    Пишем javascript, код на сервере для экспорта и возвтрата данных. Используем на сервере данные по умолчанию, т.е. те которые были в коде (для профи это уже третий звоночек).

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

    Люди смотрят функционал и говорят. Это не работает. Мы изменяем фильтр, а данные в экспорте не изменяются (смотри звоночки 1, 2, 3, 4). Изменяем пейджинг данные не меняются (тоже самое). Все очень плохо, у людей паника. Вывод это делал не профессионал!


    Разбор полета.
    Когда разработчик выполняет задачу, из-за трудностей связанных с интеграцией и учитывания факта "сделать быстро", он забывает о простых вещях: минимум план тестирования (основной функционал), понимание содержания используемых данных и т.д.

    Как повел бы себя профи. Звонок первый: т.к. описание для задачи краткое, нужно понять, что оно значит. Звонок второй: имеются инструменты для "фильрации" данных, учитывая описание, следует предположить, что это же должно соблюдаться и для экспорта, т.е. при экспорте нужно учитывать выбранные условия "фильтрации". Звонок три: понять как на сервере формируются данные на основе каких условий, как они связаны с "фильтрацией" на стороне клиента. После этого имеем весь механизм работы связки "клиент-сервер-экспорт". Пишем экспорт на сервере, учитывая полученную информацию. Звонок четыре: описываем основной с вашей точки зрения функционал, учитывая полученные данный звонков 1,2,3. Тестируем сами. Дальше просим отдел QA посмотреть минут 20-30 ваш функционал (ip адрес вашего локального сервера). Если нужно правим. Все получаем хорошую реализацию задания. Это профи.

    До этого нужно расти. Будем расти!!! И всем желаю.
    Удачи.

    Странно, здесь не встретился "северный песец". Это редкое "создание", кто-то преувеличивает. =)

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

    Делить так делить

    О чем пойдет речь? Поговорим о дизайне. Я конечно не дизайнер, но для того, что бы дизайнер ставил всякие рюшечки и задал свою цветовую палитру, требуется что-то такое!
    Здесь не будут рассказаны тайны мироздания, просто зарисовка из жизни.
    В любом web-приложении есть:
    • страничка с разметкой HTML;
    • таблицы стилей CSS;
    • javascript-ы;
    • сервер.
    Что требуется? Нужно сделать так, чтобы смена дизайна была легкой процедурой.
    Опустим умные речи про то, как все работает в web и перейдем к делу.
    Все оформление и дизайн в хорошем случае находится в css. Вот и все меняй не хочу. Но там много всего такого, что если неопытный человек начнет изменят, то будет "северный писец" =).
    Выход до банальности прост.
    Создаем новую иерархию каталогов со звучными названиями, например, цвета, рисунки, кнопки и т.д.
    В этих каталогах размещаем новые css-файлы с говорящими названиями, основной фон, кнопки, текст и т.д.
    В сss-файлах создаем css-классы с говорящими названиями (фон, кнопка увеличит и т.д). В эти классы переносим только 2 - 3 строчки отвечающие за дизайн (путь к картинке и смещение в ней, цвет фона и т.д), в основном классе их комментируем и пишем, что перенесены туда-то.
    Новые css-классы дописываем к тем, где используются основные.
    Для рисунков можно придерживаться принципа: cоглашение вместо конфигурации, это означает, что в вместо бесконечных настроек и кучи вариантов есть определенные соглашения о том, как надо делать. Это можно реализовать как, все иконки для кнопок размером 16*16, все иконки лежат в каталоге таком-то с таким-то именем и расположением картинок внутри.
    Вот и все. Жизнь становиться прекрасной.
    Нужно изменить иконки: рисуем новую картинку и сохраняем куда надо. Если изменяем одну картинку, а остальные не трогаем, то идем в css находим нужный класс меняем путь к картине, обнуляем смещение.
    Основные проблемы:
    • стало больше css-классов (много мест где менять);
    • все, что раньше относилось к одному css-классу теперь размазано по нескольким (сложность);
    • для картинок повторение атрибута пути к файлу (дублирование);
    • и т.д. =)
    Но теперь у вас главный плюс: удобство при изменении дизайна =)

    суббота, 15 января 2011 г.

    Кратко о link_to и символах

    В основе лежит пост Ruby Symbols

    Как очень просто и быстро в view создать линк. Используем erb и link_to (это по "науке" ActionView helper function).
    Пример использовыания:
    <%= link_to 'link', :action => 'myaction' %>
    Вопрос, что здесь такое :action. Это и есть символ (Symbol). В rails символы используются как строки для использования в разных местах. Если будет проще, то они являются "заполнителями" для идентификаторов и строк. 
    В качестве примера, будем использовать в качестве имени действия не строку, а символ:

    <%= link_to 'link', :action => :myaction %>
    Вы наверное спросите: как создать символ?
    Для создания символов есть несколько путей.
    Приведем пример, как можно создать символ :myaction.
    Это можно сделать следующими способами:

    <%= link_to 'link', :action => :'myaction' %>
    <% myvar = 'myaction' %>
    <%= link_to 'link', :action => :"#{myvar}" %>
    <%= link_to 'link', :action => myvar.intern %>
    <%= link_to 'link', :action => "myaction".to_sym %>

    В чем сокральная прелесть симоволов, а в том, когда символ создан, во время выполнения программы в памяти хранится только одна его копия. То есть Ruby, вместо того чтобы делать копию за копией, хранит ссылку на адрес единственной ячейки памяти.
    Экономия памяти, господа, ЭКОНОМИЯ!!! =)

    Быстренько о FasterCSV

    Нужно просто и быстро импортировать или экспортировать в CSV!
    На помощь приходит FasterCSV.
    Описание и примеры использования по ссылкам:
    Код и описание
    Документация
    Примеры как парсить CSV в Ruby (различные способы)

    Если нужны примеры кода в таких постах пишем замечания в сообщениях =)

    четверг, 13 января 2011 г.

    Пакет RubyGems


    Пакет RubyGems - менеджер пакетов для Ruby, предоставляющий возможности манипулирования гемами (gems).
    gem - функциональный модуль, написанный для Ruby On Rails.


    Часто используемые возможности пакета:
    • текущая версия
    gem -v
    • обновление RubyGems на последнюю версию
    gem update --system          # необходимо быть администратором или root
    •  поиск гема
    gem search postgres -r
    • установка гема
    gem install postgres
    • удаление гема
    gem uninstall postgres
    • получение списка гемов, установленных локально
    gem list
    • получение списка гемов на удаленных серверах
    gem list -r
    • возможность использования из Ruby-кода
    require 'rubygems'
    • поддержка многоверсионности при администрировании
    • поддержка многоверсионности при программировании
    require 'rubygems'
    gem 'activerecord', '= 1.4.0'


    Дополнительная информация на rubygems.org.

    IT-сленг

    ADN          Any day now
                 - Тепеpь в любой день
    AFAIK        As Far As I Know
                 - Насколько я знаю
    AMF          Goodbye (Adios Mutha-......)
                 - До свидания
    AWGTHTGTTA?  Are We Going To Have To Go Through This Again?
                 - Мы должны пpойти чеpез это еще ?
    BBS          Bulletin Board System
                 - Система доски объявлений
    BTW          By The Way
                 - Между пpочим
    CU           See You
                 - Увидимся (до свидания)
    CUL          See You Later
                 - Увидимся позже (до свидания)
    DIIK         Damned if I know
                 - Чеpт бы меня побpал, если я знаю это! (я не знаю)
    FITB         Fill In The Blank....
                 - Заполни бланк
    FROPPED      F..king dROPPED
                 - Чеpтово dropped
    FWIW         For What It's Worth
                 - Для чего это годно
    FYBITS       F..k You, Buddy, I'm The Sysop
                 - Пошел к чеpту, паpень, я Системный Опеpатоp
    FYI          For Your Information
                 - Для Вашей инфоpмации
    GD&R         Grinning, ducking & running (usually left at the end of a digging message)
                 - DIIK
    GROK         As in "I GROK"  means thorough understanding.  From R.A. Heinlin)
                 - Как и в "I GROK" означает полное понимание
    GIWIST       Gee I Wish I'd Said That
                 - Я хотел бы, чтобы Я это сказал
    IC           I See
                 - Я вижу (понимаю)
    IMHO         In My Humble Opinion
                 - По моему скpомному мнению
    IMNSHO       In My Not So Humble Opinion
                 - По моему не такому уж скpомному мнению
    IOW          In Other Words
                 - Дpугими словами
    JSNM         Just Stark Naked Magic
                 - Совеpшенно явная магия
    L8R          Later
                 - Позже
    LAB&TYD      Life's A Bitch & Then You Die.
                 - Жизнь с.ка и поpа помиpать
    LOL          Laughing Out Loud
                 - Гpомко смеясь
    NBFD         No Big F***ing Deal
                 - Ничего сложного в этом чеpтовом деле
    OFTPATHIRIO  Oh F..k This Place And The Horse It Rode In On!
                 - Пошло к чеpту это место вместе с лошадью, к-я его пpивезла!
    OIC          Oh, I See
                 - О, я вижу (понимаю)
    OTOH         On The Other Hand
                 - С дpугой стоpоны
    PFM          Pure F***ing Magic
                 - Пpосто чеpтова магия
    PITA         Pain In The Arse
                 - Боль в заднице
    POV          Point Of View
                 - Точка зpения
    ROTFL        Rolling On The Floor Laughing
                 - Смеюсь катаясь по полу
    RSN          Real Soon Now
                 - Тепеpь действительно скоpо
    RTFM         Read The F..k... Manual
                 - Пожалуйста, почитайте описание
    SYSOP        System Operator
                 -
    TANJ         There Ain't No Justice
                 - Нет в жизни спpаведливости
    TANSTAAFL    There Ain't No Such Thing As A Free Lunch
                 - Бесплатных завтpаков не бывает
    TPTB         The Powers That Be
                 - DIIK
    TTBOMK       To The Best Of My Knowledge
                 - К лучшему из моих знаний
    TTFN         Ta Ta For Now
                 - тепеpь та та (DIIK)
    TTUL         Talk To You Later
                 - Поговоpим позже
    WTF          What the F***
                 - Какого чеpта
    WYSIWYG      Whats you see is whats you'se get.
                 - Что видите, то и получаете

    Метаалл! Rails Metal

    Пару линков для затравки:
    Rails Metal или Rails Metal
    Introducing Rails Metal
    Rails on Rack

    Познаем и радуемся жизни! =)
    В светлое будущее!!!!

    Ruby и &

    В Ruby можно встретить такие вот "элегантные" (элегантности хоть отбавляй) конструкции:



    def contrived(a, &f)
        # блок (block) может быть доступен через f
        f.call(a)
        # но yield также работает!
        yield(a)
    end
    def some_method(&block) 
        block.class 
    end


    Объяснение этой элегантности можно найти в Унарный амперсанд

    Рассмотрим пример:

    User.all.map &:name           # получить массив имен пользователей

    вместо


    User.all.map { |user| user.name }

    Сначала кажется что это свойство перечисляемых классов, но на самом деле это не так.

    Магия #1.

    Когда ruby встречает амперсанд (&) в последнем аргументе вызова метода,
    то пытается превратить его в выполняемый блок кода (Proc). Например:

    a = (1..10).to_a
    a.map { |n| n*n }             # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
     
    l = lambda { |n| n*n }
    a.map &l                      # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    Магия #2.

    Ruby, встречая амперсанд, превращает обьект в выполняемый блок через вызов метода #to_proc.

    И вот он главный сюрприз, вызывая #to_proc у Symbol мы получаем примерно следующий блок кода:

    lambda { |x| x.send(self) }

    То есть Symbol#to_proc возвращет именно тот блок, который мы от него ожидали, потому что он в таком виде уже определен в классе Symbol.


    Пару слов про:


    def some_method(&block) 
        block.class 
    end
     
    В этом примере знак & - это способ отметить аргумент, который будет соответствовать передаваемому блоку.
    Для вызова блока нужно вызвать метод call у нашего блока c требуемыми параметрами (our_block.call(x))
     
    Давайте узнаем, чем же на самом деле в последнем примере является наш блок (block).
     
    puts some_method {}# => Proc


    Вот такие чудеса.


    среда, 12 января 2011 г.

    Что нам стоит код постоить

    Предположим, что необходимо оценит временные затраты по написанию кода (создание определенных функций). Как провести эту оценку.
    Упрощаем задачу, пусть имеется код и его нужно покрыть тестами. Сколько нужно на это времени (дней).
    За основу можно взять COCOMO. COnstructive COst MOdel (COCOMO – модель издержек разработки) – это алгоритмическая модель оценки стоимости разработки программного обеспечения, разработанная Барри Боэмом (Barry Boehm). Модель использует простую формулу регрессии с параметрами, определенными из данных, собранных по ряду проектов.

    Мы будем проще. Что нам понадобиться:
    1. COLNC. Число не оттестированных строчек кода (т.е. строчка кода которую можно протестировать или оператор цикла и т.д.). Что-то вроде SLOC. По-русски: Количество строк кода (Source Lines of Code — SLOC) — это метрика программного обеспечения, используемая для измерения его объёма с помощью подсчёта количества строк в тексте исходного кода. (измеряется в строчках)
    2. k. Средняя сложность строчки кода, т.е. можно интерпретировать как: во сколько больше строчек кода теста нужно написать для тестирования исходной (не оттестированной) строчки кода. (безразмерный коэффициент)
    3. Tw. Длительность рабочего дня (пусть будет в минутах в день).
    4. t. Среднее время, которое тратиться на написание одной строчки теста. (должно быть тоже в минут).
    Тогда, в самом простом случае имеем:
    TotalTime = (k*COLNC)/(Tw/t), что получаем
    (Tw/t) - это сколько строчек теста можем написать за день.
    k*COLNC- это сколько строчек теста нужно написать.
    (k*COLNC)/(Tw/t) - это сколько дней будем писать тест.

    Забавно! =)

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

    Ставим nokogiri

    Бывает так, что стартуешь сервер: script/server
    А он тебе в ответ:
    => Booting WEBrick
    => Rails 2.3.5 application starting on http://0.0.0.0:3000
    The following gems have native components that need to be built
      nokogiri  = 1.4.1

    Run `rake gems:build` to build the unbuilt gems.

    Делаешь rake gems:build
    А в ответ:
    rake aborted!
    ERROR: Failed to build gem native extension.
    ...
    libxslt is missing.  try 'port install libxslt' or 'yum install libxslt-devel'

    Выход есть!!! =)

    Если у вас Ubuntu делаем так:

    # ruby developer packages
    sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8
    sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby

    # nokogiri requirements
    sudo apt-get install libxslt-dev libxml2-dev
    sudo gem install nokogiri

    Если нужна определенная версия например 1.4.1
    sudo gem install nokogiri --version '= 1.4.1'

    Если остались вопросы идем: Installing Nokogiri

    Лень и как с ней жить

    По мотивам: Лень — механизм

    В России начались рабочие будни. Прошли праздники, выходишь на работу и как-то все не то и не так. За всем этим может стоять ОНА - ЛЕНЬ.

    Для того, что бы взять ситуацию в свои руки. Пару слов, что такое лень и как с ней жить. =)

    Для начала простое определение:
    Лень — это нежелание что-либо делать.

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

    Многие считают, что лень является лишь проявлением работы нашего подсознания, а значит ее можно контролировать и «настраивать» как вам того желается. Возможность управления появится, когда придет пониманте механизма ее возникновения.

    Другие считаю, что в основе всего лежат чувства, т.е., как я понимаю, подсознание. Восприятие мира через упращенный механизм шаблонов и предыдущего опыта.
    Стоит отметить, что для формирования работы позсознания необходимо произвести процесс осознания, а это процесс рациональный, но субъективный.
    Основная идея про сознание и подсознание: Сознание не оперирует чувствами, оно «осознает». Подсознание же старается нас вести по жизни оптимальным путем, точнее тем путем, который оно считает оптимальным на основе прошлого опыта, и делает оно это при помощи чувств, в том числе и лени.


    Основываясь на том, что лень — это отсутствие мотивации психики на совершение определенной последовательности действий для достижения какой-либо заранее известной цели, можно видеть три составляющих механизма лени, каждый из которых может ее создавать:

    1. Точка отсчета.
    2. Порядок действий.
    3. Конечная цель.
    Механиз лени
    Как только возникает нарушение равновесия (точка отсчета), человек формирует конечную цель, которая является восстановлением начального состояния (комфорта), и в зависимости от опыта человека (его моделей предсказания), человек выбирает порядок действий для достижения цели.


    Опишем составляюшие лени подробнее.


    Точка отсчета
    Причиной для возникновения любых действий должно быть нарушение равновесия психики (в частности нарушение "зоны комфорта" человека), которое должно быть восстановлено. Природа организма человека максимально мотивирует нас на самые простые действия, которые важны для выживания, именно поэтому мало кто испытывает лень «поесть, если проголодался». В области основных инстинктов человека лень не возникает.
    В случае же более сложного поведения, которым обладает человек, всё гораздо более неоднозначно.
    Например:
    Жена пилит мужа, который уже несколько месяцев «не принес копейки в дом» и сидит играет в WOW: «Сходи устройся на работу!». Мужу — лень. Причина лени: его всё и так устраивает, кроме постоянных напоминаний жены. Но так как возможность ничего не делать и играть, для его более приятная и ценная, чем раздражение от слов жены, он так и будет дальше сидеть и лениться.

    Любое действие должно иметь точку отсчета: необходимость, неудобство, нужду и т.п. Эта точка отсчета должна быть именно индивидуальной, а не навязанной. Вы что-либо сделаете только в том случае, если вас действительно что-то неустраивает. Этот пункт тесно пересекается с «Конечной целью», так как точка отсчета всегда однозначно определяет то, какая цель должна быть достигнута.

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

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

    Порядок действий
    Наиболее распространенной причиной лени в текущем обществе является неоднозначность порядка действий, т.е. пути достижения цели. Человек не будет внутренне мотивироваться на определенные действия, если его подсознание подсказывает ему, что есть более эффективный путь: более быстрый, требующий меньшей затраты ресурсов и усилий и т.п.
    Например:
    Офисный сотрудник ленится делать свою работу на рабочем месте. У него есть точка отсчета (необходимо выполнить работу), однако ему лень. Причина лени — он знает что делать эту работу сейчас не обязательно, а можно просто посидеть на «Вконтакте». Он экономит свои ресурсы.

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

    Мотивация сотрудника офиса значительно возрастает по мере приближения решения о вручении ему премии или прихода "северного песца".

    Конечная цель
    Конечная цель полностью определяет то, какая стратегия будет выбрана. Также конечная цель должна быть всегда привязана к ценностям и потребностям человека.
    В человеческом сообществе очень распространен механизм обучения, в котором человеку прививают цели, ценность которых он для себя не осознает.
    Например:
    Родители склонны говорит студенту, что тот должен получить диплом, чтобы у него было высшее образование. От такого «прививания цели» не возникнет никакой мотивации. Студент просто не будет подсознанательно понимать какая связь между его потребностями и «бумажкой». Худший вариант, если студент будет мотивироваться на учебу в институте целью «лишь бы предки не жужжали».

    Какая будет ставиться цель, так ее и будет достигать человек.

    К слову сказать, если вы стараетесь сформировать мотивацию в человеке, даже в собственном ребенке, развейте его модели предсказания так, чтобы его подсознание и сознание само понимало важность этих действий. Тогда человек сам «понесется» ее достигать.

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

    В заключение
    Что дальше?! Дальше нужно понять и действовать. Попробывать и понять, работает это или нет. Все в ваших руках.
    Удачи и плодотворной рабочей недели.

    понедельник, 10 января 2011 г.

    Мелочь из JavaScript

    Как корректно использовать точку с запятой в JavaScript-е?
    Читаем Всё, что надо знать о точке с запятой

    Рабочий момент: рефокторинг в виде отформатировать текст знаком всем =)
    А что будет, если внешне изменение не значительное, а его суть коварна.
    Будет два варианта: 1. вернуть назад и не трогать ничего (с газом, без газа - попил водички...) =)
    2. узнать, обучить и стать специалистом =). В помощь спецификация
    Второе круче.
    Поэтому, запомним кое-что про ограниченные порождения:
    Практический совет для программистов ECMAScript:
    • постфиксные операторы "++" и "--" должны быть на одной строке со своим операндом;
    • выражение в операторах return или throw должно начинаться на одной строке с токеном return или throw;
    • идентификатор в операторе break или continue должен быть на одной строке с токеном break или continue.
    Примеры:

    i
    ++   это будет как  i; ++j
    j
    Так нельзя:
    return
              {i:i, j:j}
    Так можно:
           return {
               i:i, j:j}
        return (
               {i:i, j:j})
        return {i:i
               ,j:j}
     
    На последок:
    continue innerloop // верно
     
    continue
        innerloop;     // неверно
    // ThrowStatement : throw [no LineTerminator here] Expression ;
    throw                                          // ошибка разбора
      new MyComplexError(a, b, c, more, args);
    // В отличии от return, break, continue, 
    // выражение после throw обязательно, 
    // поэтому вышеприведённое неотпарсится вообще.
    throw new MyComplexError(a, b, c, more, args); // верно
    throw new MyComplexError(
        a, b, c, more, args);                      // тоже верно
    // любой вариант с throw и new на одной строке верен.
     

    Launchy

    Что это за зверь: http://copiousfreetime.rubyforge.org/launchy/
    Линка на код: https://github.com/copiousfreetime/launchy

    Основная идея:
    Иногда бывает так, что тест BDD валится, и еще в добавок сложно определить почему, точнее приложенные усилия не стоят потраченного времени. Другое дело, если взглянуть на страницу, на которой тест (например Cucumber) не нашел кнопку «Создать». Для этих целей можно использовать launchy.


    Как использовать:
    Для начала пишем определенный код.

    Например для Cucumber

        Then 'WTF?' do
          save_and_open_page
        end

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


    На основе статьи "Rails: Хватит отмазываться, начинаем BDD-ить!": http://habrahabr.ru/blogs/webdev/111480/

    воскресенье, 9 января 2011 г.

    Introduction

    Всем привет! =)
    Основное назначение этого блога записывать и делится с миром рабочими моментами.
    В основном будет про программирование на Ruby on Rails. Возможно, что не все будет так гиковски, может и про жизнь напишу.
    Предлагаю начать, а дальше будет видно!!