Ruby Regexps

10 февраля 2009, Вторник

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

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

Список самых популярных регулярных выражений:

  • Валидация почты:
    /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
  • Валидация URL сайта
    /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/
  • Валидация кредиток:
    # Почти всех
    '^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$'

    # American Express
    '^3[47][0-9]{13}$'

    # Diners Club
    '^3(?:0[0-5]|[68][0-9])[0-9]{11}$'

    # Discover
    '^6011[0-9]{12}$'

    # MasterCard
    '^5[1-5][0-9]{14}$'

    # Visa
    '^4[0-9]{12}(?:[0-9]{3})?$'

    # Чистка не цифр
    '/[^0-9]+/'
  • Проверка номера телефона:
   #1
   /^(8-(0\d{2})-(\d{3})-(\d{2})-(\d{2}))$/
   #2
   /^(38(0\d{9}))$/
  • IP адресса:
    #1
    '\b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b'
    #2
    /(?:[0-9]{1,3}\.){3}[0-9]{1,3}/

    #3
    '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'

    #4
    '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'

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

Ruby & RubyOnRails weblogs

7 февраля 2009, Суббота

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

Пользуемся на здоровье:

Ruby:

http://feeds2.feedburner.com/RubyInside
http://feeds2.feedburner.com/Rubyflow
http://on-ruby.blogspot.com/feeds/posts/default?alt=rss
http://www.igvita.com/feed/
http://www.abletech.co.nz/feed/
http://feeds.feedburner.com/PaulDixExplainsNothing
http://feeds.feedburner.com/momoro
http://feeds2.feedburner.com/DrNic
http://www.juixe.com/techknow/index.php/feed/
http://feedproxy.google.com/buckblog
http://feeds.floehopper.org/floehopper-blog
http://talklikeaduck.denhaven2.com/xml/rss20/feed.xml
http://feeds.feedburner.com/tagaholic
http://phvalues.wordpress.com/feed/
http://brainspl.at/xml/rss20/feed.xml
http://blog.mmediasys.com/feed/

Rails:

http://carlopecchia.eu/blog/feed/
http://feeds.feedburner.com/VigetExtend
http://www.culann.com/feed
http://feeds.feedburner.com/TechnicalPickles
http://feeds.feedburner.com/AtlanticDominionSolutions
http://feeds.feedburner.com/jystewart/iLiN
http://feeds.feedburner.com/ZachInglis
http://www.fngtps.com/feed/index.rss
http://feeds2.feedburner.com/railscasts
http://feeds.feedburner.com/RidingRails
http://hivelogic.com/feed
http://www.rubyrailways.com/feed/
http://feeds.feedburner.com/obie
http://blog.kineticweb.com/xml/rss20/feed.xml
http://feeds.feedburner.com/rubyonrailspodcast

Rails + Populator + Faker

29 ноября 2008, Суббота

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

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

Чтобы сэкономить время рекомендую воспользоваться библиотекой populator.

Ставим:

  gem install populator 

Используем. Например, нам нужно добавить в базу 3000 записей о пользователях

  User.populate(3000) do |user|
    user.first_name = “Tony”
    user.last_name = “Stark”
  end

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

Для этого есть еще одна чудная библиотечка faker. Ставим:

  gem install faker 

Теперь перепишем наш пример, добавив пару дополнительных полей и оформив в rake задачу, чтобы удобно было запускать, например в production:

  require ‘populator’
  require ‘faker’

  require ‘rake’
  require ‘rake/testtask’
  require ‘rake/rdoctask’

  require ‘rubygems’
  require(File.join(File.dirname(__FILE__), ‘../../config/environment.rb’))

  namespace :populate do
     desc “Add test data”
     task(:users) do
       User.populate(3000) do |user|
         user.first_name = Faker::Name.first_name # генерирует Имя
         user.last_name = Faker::Name.last_name   # Фамилию
         user.email = Faker::Internet.email       # мыло
         user.login = Faker::Internet.user_name   # логин
         user.phone = Faker::PhoneNumber.phone_number # номер телефона
         user.about = Faker::Lorem.paragraphs( 5 ) # О себе – 5 параграфов
       end
    end
  end

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

Строим графики и диаграммы с open flash chart

22 октября 2008, Среда

Очень часто возникает необходимость каким-либо способом визуализировать данные, например в виде графиков и диаграмм. В такой ситуации на помощь может прийти плагинчег - open flash chart.

Ну и для начала установим его:

ruby script/plugin install http://svn.pullmonkey.com/plugins/trunk/open_flash_chart/

После нужно скопировать файлик open_flash_chart.swf в path/to/your/app/public/ и файлик swfobject.js в  path/to/your/app/public/javascripts.

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

Cheat sheets

3 октября 2008, Пятница

В последнее время в интернете появляется все больше разного рода шпаргалок, так называемых Cheat Sheet.

Мы собрали парочку ссылок на самые интересные (с нашей точки зрения). Итак:

  • Вот на этом сайте часто выкладывают довольно толковые.
    • Subversion Cheat Sheet pdf, png;
    • Regular Expressions Cheat Sheet pdf, png;
    • CSS Cheat Sheet pdf, png;
    • HTML Cheat Sheet pdf, png.
  • Кроме того есть еще и такой сайт где собраны все самые интересные шпаргалки в одном месте. Приведу парочку прямых ссылок:

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

composite primary keys

2 октября 2008, Четверг

Дело в том, что Ruby on Rails не поддерживает составные первичные ключи. Но эту проблему можно решить с помощью гемки composite_primary_keys.

И ставим gem:

  gem install composite_primary_keys

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

  require 'composite_primary_keys'

  class Probability < ActiveRecord::Base
    set_primary_keys :row, :col
  end

И напоследок несколько примеров использования:

  Probability.primary_key # => [:row, :col]
  Probability.primary_key.to_s # => "row,col"
  Probability.find(1,1) # => <Probability row: 1, col: 1, val: 17>
  Probability.find [1,1],[1,2] # => [<Probability row: 1, col: 1, val: 17>, <Probability row: 1, col: 2, val: 19>]
  Probability.find(:first).to_param # => "1,1"

ferret - Полнотекстовый поиск в вашем сайте

27 сентября 2008, Суббота

Создание поиска по сайту задача частая и тривиальная. В Rails в основном осуществляется поиск по информации, которая хранится в моделях. Для этого в ActiveRecord есть метод find. Существует масса примеров как можно осуществлять поиск при помощи этого метода. Но у него есть существенный недостаток. На самом деле это обертка вокруг SELECT запроса, поэтому если ваш поиск сложнее чем просто выборка этот метод вам не подойдет. Кроме того, простой find имеет существенный недостаток - скорость. Если Вы используете MySQL, можете переключиться на MySQL full text search - лично я не пробовал но блоги пишут, что сильно ускоряет. Решение плохое так как привяжет вас к СУБД, что не есть очень хорошо.

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

Но наряду с позитивом есть и негатив. Lucene - написан на жаве и для того чтобы его использовать нужно поднимать на сервере жаву, Tomcat и т.д. В принципе ничего сложного, тем более есть мануалы.

Но есть альтернатива! ferret - библиотека для полнотекстового поиска написана на Ruby.

Инсталлируем

 gem install ferret

Правда просто? ИМХО gem - гениальная вещь.

Но, есть одно маленькое НО. Для успешной установки ferret на Win32 необходимо иметь в наличии компилятор С/С++. Я воспользовался для этого VC++ 6.0. Для того чтобы все прошло гладко, необходимо настроить пути компиляции( переменные окружения LIB, INCLUDE, PATH).

Используем совместно с ActiveRecord в RubyOnRails

Для того чтобы все было гладко есть плагин - Acts as Ferret. ( Правда этот плагин доступен также и как gem ).

Ставим плагин

script/plugin install svn://projects.jkraemer.net/acts_as_ferret/tags/stable/acts_as_ferret

Используем в моделях

Вписываем в модель такой код:

class Foo &lt; ActiveRecord::Base
   acts_as_ferret
end

Тоже не сложно. После такой записи у вас будет доступен следующий синтаксис:

 Foo.find_with_ferret("запрос")

Кроме того ferret создаст директорию index в Вашем проекте, в которой создаст также поддиректории конфигураций запуска (test, development, production). В этих директориях ferret и будет сохранять индексы. Для каждой модели будет создано свою поддиректорию.

Индексом можно управлять. По умолчанию добавление/удаление данных в модели провоцирует обновление индекса. Кроме того Вы сами можете настраивать, что отображать в поиске а что нет. Для постраничного вывода также существует ряд параметров поиска (limit, page).

Это конечно только вершина айсберга использования ferret, завесу понимания приоткроет чтение документации.

Вот и все. Будут вопросы - пишите.

CSV with Ruby

22 августа 2008, Пятница

Если стоит задача работы с csv(Comma Separated Values) файлами на помошь может прийти замечательная гемка fastercsv. Ставится она, как и все, очень просто:

gem install fastercsv

Ну и конечно небольшой примерчег кода где открывается csv файл, парситься и выводиться его содержимое в консоль:

require ‘fastercsv’

FasterCSV.parse( File.open( “example.csv” ) ) do |row|

row.each {|cell| puts cell}

end

Вот и все :)

Playing with twitter

22 августа 2008, Пятница

Почти Все знают про твиттер. Кто не знает быстро вникаем в тему. Весчь прикольная. Можно писать о том где ты и чем сейчас занят. И еще это одно из самых больших и посещаемых RoR приложений.

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

Ставим гемку:

sudo gem install twitter4r

Примерчег

config_file = File.join(File.dirname(__FILE__), ‘twitter.yml’)
twitter = Twitter::Client.from_config(config_file,’development’)

twitter.timeline_for(:me)do |status|

puts status.to_yaml

end

Вопчем играемсо.

Tha ruby - Tha language

25 июля 2008, Пятница

Задача:

Сделать xml заглушку ответа состоящую из 20 постов.

Решение на руби:

def success_post_message
messages = “”
20.times do
messages << %Q!

<message>

<guid>#{Time.now.to_f}</guid>
<body>The time is #{Time.now.to_s}</body>
<author_id>author_id_#{Time.now.to_i - 100}</author_id>
<created_at>#{Time.now.to_s}</created_at>

</message>

!
end
%Q!
<?xml version=”1.0″ encoding=”UTF-8″?>
<ciabe_response>

<message>Successfully created</message>

<code>201</code>
<data>

<messages>#{messages}</messages>

</data>

<errors>
</errors>

</ciabe_response>
!
end

Вот так вот товарищи. Не перестаем восхищатьсо…

Блог работает на WordPress.
Подписка RSS: все записи, комментарии.