субота, 31 грудня 2011 р.

З Новим Роком!


Ruby-ua вітає усіх з Новим 2012 Роком, який настане вже через кілька годин!

Бажаю в новому році творчих успіхів, гарного коду, відкритих API, швидкого заліза і щоб кваліфікація ваша тільки росла.
$ ruby -e 'def a;10.times{puts " "*rand(79)+"*"};end;99.times{a;puts " "*34+"З Новим 2012 роком!";a;sleep 0.1;puts "\e[2J"}'

Ура! З наступаючим!

середа, 28 грудня 2011 р.

Ретроспектива 2011


2011 рік добігає кінця, і я згадав запис, у якому згадував про найбільш значущі події в світі Ruby, що відбулися в 2010. Хотілось вірити, що тенденція збережеться. Так і сталося.

Цей рік приніс декілька приємних новин:
  • У 2011 році Ruby став повнолітнім
  • Реліз 1.9.3 - основної реалізації мови програмування Ruby
  • Оголошено про початок робіт над Ruby 2.0
  • Опублікований план підготовки релізу Ruby 2.0
  • Matz автор мови Ruby в інтерв'ю виданню InfoWorld повідомив, що працює над діалектом мови для мобільних пристроїв
  • Yukihiro Matsumoto тепер працює в Heroku
  • Припинена підтримка Ruby 1.8.6

Розвиток альтернативних реалізації мови Ruby:
  • Реліз MagLev 1.0, альтернативної реалізації Ruby VM з вбудованим NoSQL-сховищем, побудованої на основі використання 64-розрядної віртуальної машини VMware GemStone/S, початково створеної для мови Smalltalk.
  • Реліз JRuby 1.6 - реалізації мови Ruby, написаної цілком на Java і призначеної для виконання у віртуальній машині JVM з підтримкою Ruby 1.9.2. Прискорення JRuby 1.7 у три рази після установки OpenJDK 7 update 2
  • Успіхи спільноти розробників Rubinius - альтернативної реалізація мови програмування Ruby, написаної на C++
  • MacRuby 0.10 - реалізація мови програмування Ruby, написаної на Objective-C і фреймворку CoreFoundation. Розроблена компанією Apple Inc. Базується на версії Ruby 1.9.

Також хочеться відмітити декілька цікавих проектів:
  • Бібліотека rbenv від 37signals: проста і легка альтернатива RVM для керування версіями Ruby
  • Ruboto - фреймворк для написання повноцінних програми для Android на Ruby
  • У 2011 склалася тенденція, що кожен проект на Ruby приєднується до Travis. Travis - дуже проста, система безперервної інтеграції, яка розповсюджується у вигляді відкритих вихідних кодів.

Інші значущі релізи:

P.S. З наступаючим Новим Роком!
P.P.S. Якщо вам є що додати, пишіть в коментарі.

пʼятниця, 23 грудня 2011 р.

Створення простого AJAX-сайту з Sinatra та JQuery

За основу цієї статті взятий скрінкаст Building a Simple AJAX Website with Sinatra & jQuery. Зараз у вільний час я працюю над сайтом isit.heroku.com, який основну свою ідею почерпнув саме цього скрінкасту.

У цій статті ви дізнаєтеся:
  • Як створити свій власний веб-сайт із таймером зворотного відліку
  • Як визначити в Sinatra, якщо запит XMLHttpRequest чи ні
  • Як відключити шаблони(layouts) для XHR запитів у Sinatra
У цьому епізоді ми будемо використовувати Sinatra, HAML і JQuery.

"Is It" веб-сайт

Ви можливо зустрічали цей жанр сайтів раніше. Це прості веб-сайти з "Так" або "Ні" в середині сторінки. Вони відповідають на питання типу "Це Різдво?", "Це Новий Рік?" або інші термінові питання. Іноді на сторінці також є таймер зворотного відліку.

Розробку нашого "Is It" веб-сайту розпочнемо з огляду структури додатку на Sinatra.
app.rb - це головний файл нашого додатку, який містить єдиний маршрут до кореневої URL-адреси. Також ви помітили, у ньому підключається файл lib/countdown.rb.

## app.rb
# -*- encoding: utf-8 -*-
require 'sinatra'
require 'haml'

require_relative 'lib/countdown.rb'

get '/' do

end

вівторок, 13 грудня 2011 р.

Асоціації в DataMapper

Прочитавши заголовок цієї статті, читач мабуть зрозуміє про що піде мова нижче. У далекому 2009 я писав статтю про DataMapper, у якій згадувались асоціації між моделями. Сьогодні з власного досвіду спробую описати найбільш поширені асоціації та роботу з ними.
Для початку освіжимо пам'ять.
DataMapper - це ORM бібліотека (англ. Object-relational mapping, Обє'ктно-реляційна проекція - технологія, яка зв'язую бази даних з концепцією об'єктно-орієнтовного програмування, створюючи "віртуальну об'єктну базу даних").

Асоціації - це спосіб оголошення відносин між моделями. Вони надають ряд методів, які дозволяють створювати відносини та отримувати пов'язані моделі.

Зараз ORM використовуються повсюдно - ніхто не намагається працювати з базою вручну. Функціонал дозволяє зробити багато речей простіше. Робота з асоціаціями стала в рази легшою. Можна не використовувати SQL-запити, а працювати з даними, як зі звичайними об'єктами.

Я писав цю статтю виключно для себе, тому методика викладання навряд чи сподобається вам своєю легкістю і доступністю :))
Картинка для затравки.
Зацікавило? Тоді ласкаво прошу під кат.

неділя, 11 грудня 2011 р.

Ruby/Tk в RVM

Так як wxRuby не розвивається більше 2-ох років, а Qt4 надмірний для моїх задач. Вибір впав на бібліотеку Tk, яка поставляється разом з Ruby.

Tk (від англ. Toolkit — "набір інструментів", "інструментарій") - кросплатформна бібліотека базових елементів графічного інтерфейсу, яка розповсюджується відкритими вихідними текстами.

Для того щоб почати використовувати Tk достатньо імпортувати бібліотеку для роботи з нею:
require 'tk'
Якщо ви отримаєте помилку
LoadError: cannot load such file -- tk
значить Tk не скомпільована з вашим Ruby.
Якщо у вас RVM, ласкаво прошу під кат.

середа, 26 жовтня 2011 р.

Модель User в DataMapper(з BCryptHash) для Warden

В процесі написанні статті Модель User в DataMapper для Warden я натрапив на цікавий тип даних BCryptHash. В DataMapper він стає доступний, якщо включити гем dm-types. BCryptHash зберігається у базі даних як рядок, що представляє сіль, хеш і вартість паролю, використовуючи алгоритм bcrypt. Він пропонує альтернативу більш звичної пари значень хеш і сіль, які зберігаються у базі даних.

Модель User в DataMapper для Warden

В минулій статті Інтеграції Warden з Sinatra і DataMapper ми написали тестовий додаток, який використовує аутентифікацію по імені і паролю. Уважний читач не міг не помітити, що паролі у базі даних зберігаються у відкритому вигляді. Це все робилося, щоб не завантажувати статтю зайвими сутностями.
Але очевидно, з точки зору безпеки паролі у базі даних повинні зберігатися в зашифрованому вигляді. Цю тему ми і розглянемо у цій статті.

За основу взята 11 глава "Task F: Administration" з книги Agile Web Development with Rails (3rd edition).

Тут основний упор буде на роботу з DataMapper. Крім того у другій частині статті ми закладемо фундамент адміністративного інтерфейсу для керування користувачами.

понеділок, 24 жовтня 2011 р.

Ruby 2.0

19 жовтня 2011 Matz, відомий як розробник мови програмування Ruby, оголосив про початок робіт над версією 2.0.


Також з'явився попередній графік випусків для Ruby 2.0.0. Як і очікувалось,  фінальну версію варто чекати 2 лютого 2013 року на 20-у річницю від дня народження Ruby.

Інтеграції Warden з Sinatra і DataMapper

В Інтернеті можна знайти багато статей на тему аутентифікації з допомогою Warden у Sinatra. Я не буду оригінальним, і напишу ще одну, щоб самому розібратися з особливостями цього інструменту. Ціллю цієї статті не є показати повністю готовий механізм аутентифікації. А лише продемонструвати основні можливості інтеграції Warden з Sinatra і Datamapper.

Warden - це Rack middleware, що забезпечує механізм аутентифікації для веб-додатків на Ruby.
Warden вимагає деяких налаштувань для Sinatra. Цього можна уникнути, використовуючи плагін Sinatra::Warden. Але ми ж не шукаємо простих шляхів.

середа, 19 жовтня 2011 р.

RubyMonk - ще один браузерний самовчитель Ruby

RubyMonk — це інтерактивна платформа, яка допоможе вам освоїти основи мови програмування Ruby. Вона поєднує в собі переваги навчання з книгою і наставником. І дає навички практичного програмування в ігровій формі.
RubyMonk можна рекомендувати початківцям, які тільки відкривають для себе мову Ruby.

Навчання проходить у двох формах:
  • Уроки. Користувач знайомиться з основами мови Ruby (масиви, ітерації, стрічки тощо). Всі уроки забезпечені докладним описом з прикладами коду, а також доповнені прекрасною можливістю самостійно виконати код.
  • Проблеми. Користувачу дається можливість самостійно написати код для вирішення певної проблеми, використовуючи знання, отримані на уроках.

пʼятниця, 7 жовтня 2011 р.

Тестування швидкодії Time і Date в різних версіях Ruby

Вчора задався питанням швидкодії бібліотек для роботи з датою і часом, які входять до складу Ruby - Time і Date.

Для для тестування був написаний простий скрипт з використанням модуля Benchmark, який надає методи для вимірювання та звітності часу, що був затрачений на виконання коду Ruby:
require 'benchmark'
require 'date'

puts RUBY_DESCRIPTION
n = 10_000

puts
Benchmark.bm(10) do |x|
  x.report("Time:")     { n.times{Time.now} }
  x.report("DateTime:") { n.times{DateTime.now} }
end

puts
Benchmark.bm(10) do |x|
  x.report("Time:")     { n.times{Time.mktime(2012, 12, 23)} }
  x.report("DateTime:") { n.times{DateTime.new(2012, 12, 23)} }
end

У тестуванні будуть брати участь наступні версії Ruby: 1.8.7, 1.9.2 та 1.9.3-rc1, а також альтернативні реалізації інтерпретатора: Rubinius написаного на мові C++ та JRuby - на Java.

Тепер подивимося на результат виконання цього скрипта:

четвер, 6 жовтня 2011 р.

Mechanize 2.0 довідник

Mechanize - це бібліотека для сканування веб-сайтів для будь-якої автоматизації або з метою тестування. Довідник по Mechanize 2.0 являє собою докладний посібник для отримання речей які можна зробити в Mechanize. Це більше ніж документація, але менше ніж книга. Робота над нею вже йде, і вона буде опублікована тут безкоштовно дуже скоро!

>>> Анонс на ruby.about.com

вівторок, 4 жовтня 2011 р.

Приклад роботи Delayed_job з DataMapper у Sinatra

Delayed_job (або DJ) бібліотека асинхронної черги фонових завдань написана на Ruby. Може знадобитись для таких типових задач як:
  • поштова розсилка
  • зміна розмірів зображень
  • конвертування аудіо/відео
  • HTTP завантаження
  • оновлення інформації
  • перевірка спаму
Спочатку написана Tobias Lütke як плагін для веб-фреймворка Rails з Active Record. На даний час підтримується компанією Collective Idea, і дозволяє використовувати ряд інших бекендів для збереження черги завдань.

понеділок, 3 жовтня 2011 р.

Реліз Sinatra 1.3.0

Світ побачила версія 1.3.0 фреймворка Sinatra. Найбільш помітне нововведення в цьому релізі - додавання streaming API. Цікавим моментом є те, що використовувати цю можливість можна незалежно від того, на якому сервері запущено додаток.
Приклад коду:
get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

Крім того додали підтримку HTTP-методу PATCH:
patch '/' do
  # ...
end

Про інші зміни читайте в офіційному прес-релізі New feature release, Contrib and Recipes

вівторок, 20 вересня 2011 р.

Коротке введення в шаблонізатор Slim

Давно хотів написати статтю про Haml, та все ніяк не доходили руки. Починаючи з 1.2 Sinatra підтримує новий шаблонізатор Slim. Вирішив познайомитися з ним, і він мені відразу сподобався. Slim взяв найкраще від Haml, і основне його завдання - зменшити об'єм коду.

Шаблони Slim можуть виглядати як Haml, використовуючи ярлики id і class, але їх використання не є обов'язковим. Як і в Haml форматування тут відбувається відступами.
Ось так виглядає приклад шаблону з використанням Slim:
Якщо Haml – це HTML на стероїдах, тоді Slim – це Haml на дієті.

четвер, 8 вересня 2011 р.

Реліз RailsInstaller 2.0

Запуск Ruby і Rails в середовищі ОС Windows не найпростіша річ у світі. Навіть з такими речами як RubyInstaller/, можна часто зіткнутися з проблемами при установці певних gem-ів, які вимагають компіляції. Що вже казати про інструменти сторонніх розробників. А як щодо Git? OpenSSH? Вам потрібно багато речей, щоб отримати "повноцінне" Rails середовище для розробки. І RailsInstaller робить це все для вас в один клік.

Хочу представити вашій увазі реліз RailsInstaller версії 2.0. У попередніх версіях RailsInstaller використовув 1.8.7. Тепер доступна і версія Ruby 1.9.2. Крім того доступний реліз-кандидат Rails 3.1. А також включені наступні пакети:
  • Git
  • Bundler
  • SQLite
  • gem-и для взаємодії з Microsoft SQL Server
  • DevKit - компілятор для ОС Windows, що дозволить встановити gem-и, яким потрібно скомпілювати C код.

Інтерв'ю з Юкіхіро Мацумото

Юкіхіро Мацумото (Yukihiro Matsumoto), автор мови програмування Ruby, в інтерв'ю виданню InfoWorld згадав про те, що він в даний час займається розробкою альтернативного підмножини або діалекту мови Ruby, спеціально адаптованої для створення програм для портативних пристроїв. Перший публічний випуск мобільного Ruby планується представити на початку наступного року. Крім того, в інтерв'ю згадується те, що після випуску релізу Ruby 1.9.3, який зараз знаходиться на етапі тестування, розробники переключаться на підготовку версії Ruby 2.0.

пʼятниця, 2 вересня 2011 р.

will_paginate 3.0: Sinatra і DataMapper

Після більше року розробки вийшла фінальна версія will_paginate 3.0. Основні зміни:
  • Підтримка Rails 3.0 і 3.1
  • Підтримка Sinatra і Merb
  • Інтеграція з DataMapper і Sequel
  • Переклад із бібліотекою i18n
  • Припинена підтримка Rails версій 1.2 - 2.3
Встановлення:
gem install will_paginate
Sinatra додаток потребує наступні бібліотеки:
require 'will_paginate'
require 'will_paginate/data_mapper'  # або active_record/sequel
Вносимо зміни до дії index, щоб виводити по 5 записів на сторінку. Номер сторінки передаватиметься у рядку запиту (наприклад, http://localhost:4567/posts?page=3)
# index
get "/posts" do
  @posts = Post.paginate :page => params[:page], :per_page => 5
  haml :"posts/index"
end
Додаємо помічник will_paginate для виведення посилань на сторінки:
#header
  %h1 Мій блог

%a{:href => "posts/new"}> New Post
#content
  - @posts.each do |post|
    .container
      %h3= post.title
      %p= post.body
      %p= post.created_at

  #pagination
    = will_paginate @posts

четвер, 18 серпня 2011 р.

Compilr - онлайн-IDE для C#, PHP, C/C++, Ruby, VB, Java

Натрапив на досить цікавий проект – Compilr. Сервіс являє собою онлайн-IDE, що дозволяє писати і компілювати код для різних платформ під будь-яким сучасним веб-браузером. Compilr постійно розвивається в ногу зі змінами у світі розробки, інтегрує новітні і найбільш актуальні платформ і мови програмування. На даний момент заявлена підтримка наступні мови: C#, PHP, C/C++, Ruby, VB, Java. Після безкоштовної реєстрації вам буде доступно 250 мегабайт вільного простору для трьох публічних проектів.

субота, 6 серпня 2011 р.

OAuth2 0.5.0

Нещодавно вийшла версія 0.5.0 бібліотеки OAuth2 - Ruby-обгортки для протоколу OAuth 2.0. У порівнянні з попередньою версією, код зазнав значних змін. Зокрема були змінені назви функцій та їх параметрів. І раніше написаний код втратив свою працездатність. У зв'язку з цим я оновив дві статті:

За цим посиланням наочно і зрозуміло проілюстровані зміни у коді при роботі з новою версією OAuth2.

пʼятниця, 5 серпня 2011 р.

#rbxday

5 серпня 2011 команда Rubinius проводить масштабне тестування своєї альтернативної реалізація мови програмування Ruby.
Ну ось, ще один привід спробувати в дії Rubinius.

Подробиці тут: http://rbxday.rubini.us

Для тестування досить встановити Rubinius з допомогою RVM і спробувати запустити ваш код.
$ sudo rvm get head
$ sudo rvm reload
$ sudo rvm install rbx
$ rbx-master --version
rubinius 1.2.5dev (1.8.7 560efecd yyyy-mm-dd JI) [i686-pc-linux-gnu]

вівторок, 2 серпня 2011 р.

Ruby 1.9.3 preview1

Вийшла у світ Ruby 1.9.3 preview1.
Попередні версії Ruby були під ліцензією GPLv2 та Ruby. У цій версії вона замінена ліцензією типу BSD з 2 пунктів і Ruby.

Для отримання додаткової інформації дивіться офіційний анонс.

Спробувати 1.9.3 можна вже сьогодні. З RVM це просто:
rvm get head
rvm reload
rvm install 1.9.3

понеділок, 1 серпня 2011 р.

OmniAuth для Sinatra

Про швидкий запуск Sinatra додатку, використовуючи OmniAuth, як протокол автентифікація я писав у OmniAuth: Зовнішня, проста автентифікація для Rack на прикладі Sinatra і ВКонтакте. Код цієї статті відрізняється від попередньої тим, що включає в себе роботу з сесіями і модель для користувачів у базі даних. Це означає, що користувач може залишатися в системі, поки ваш сервер залишається живим.

Для прикладу використовуватимемо ВКонтакте. Але ви можете використовувати будь-якого іншого постачальника аутентифікації, що підтримується бібліотекою OmniAuth.

вівторок, 26 липня 2011 р.

Rack::Webconsole - інтерактивна консоль для веб-додатків

Rack::Webconsole надає Rack "прошарок"("middleware"), який включає інтерактивну консоль у користувацький інтерфейс вашого веб-додатку. Він працює із Rails 3, Padrino, Sinatra, і є чудовим способом заглянути під капот вашого додатку без доступу до сервера.
Встановити Rack::Webconsole можна як і будь-який інший gem:
$ gem install rack-webconsole

Rack-прошарки - це компоненти, які «сидять» між сервером і вашим додатком, і відстежують і/або маніпулюють HTTP запитами/відповідями для надання різної функціональності.
У Sinatra дуже просто використовувати такі "прошарки" за допомогою методу use:
require 'sinatra'
require 'rack/webconsole'

use Rack::Webconsole

Rack::Webconsole потребує JQuery. Для цього ви повинні додати наступний рядок до вашому додатку:
Rack::Webconsole.inject_jquery = true

І це працює! Запустіть сервер, зайдіть на будь-яку сторінку і натисніть клавішу `.

Більше інформації на офіційній сторінці rack-webconsole.

четвер, 21 липня 2011 р.

Flash-повідомлення і Sinatra

Rails має приємний маленький хеш, який називається Flash. Це не супер герой, який може розвивати надзвукову швидкість і використовувати надлюдські рефлекси, а лише витончений спосіб тимчасового зберігання повідомлень між запити. Наприклад, якщо щось відбувається у вашому додатку (наприклад, зберігається), а потім користувач перенаправляється на іншу сторінку, то ви могли б зберігати повідомлення в Flash про те, що запис був збережений. Це повідомлення потім буде показане на наступній сторінці (після перенаправлення).

Офіційний FAQ по Sinatra рекомендує використовувати Rack::Flash, щоб отримати ту ж функціональність.
Один із розробників фреймворку Sinatra - Konstantin Haase у своєму twitter рекомендує використовувати Sinatra::Flash
If you're using it with Sinatra, switch from rack-flash to sinatra-flash
--http://twitter.com/konstantinhaase/status/92219479890726912

Про нього і піде мова нище.

субота, 16 липня 2011 р.

Реліз Ruby 1.9.2-p290 і план 1.9.3

В офіційному блозі Ruby Shota Fukumori оголосив про випуск 1.9.2-p290, останнього "patchlevel" випуску поточної версії мови Ruby MRI. Цей реліз не містить жодних виправлень безпеки, але виправлено багато помилок.

Дивіться ChangeLog для деталей.

Якщо ви користуєтеся RVM, виконайте наступні команди для оновлення:
rvm get head
rvm reload
rvm upgrade ruby-1.9.2-p180 ruby-1.9.2-p290
rvm ruby-1.9.2-p290 --default

1.9.3 вже майже тут!
Розклад:
  • 2011-07-10: створення гілки ruby_1_9_3
  • 2011-07-17 або 18: ruby-1.9.3-preview1
  • 2011-08-01: ruby-1.9.3-preview2
  • 2011-08-26: ruby-1.9.3

середа, 29 червня 2011 р.

Mechanize 2.0

Після більше року активної розробки вийшла нова версія Mechanize - Ruby-бібліотеки для автоматизації взаємодії з веб-сайтами. У новій версії проведена велика робота з усунення помилок, а також додані нові можливості. Дивіться офіційний анонс для більш докладної інформації.

вівторок, 21 червня 2011 р.

ВКонтакте → Авторизація Standalone-додатків використовуючи OAuth 2.0 на прикладі Ruby і Mechanize

Про авторизацію Desktop-додатків ВКонтакте на прикладі Ruby і Mechanize я писав більше року тому. З того часу спливло чимало води:
  • Для авторизації додатків використовується відкритий протокол OAuth 2.0.
  • Запити до API здійснюються без необхідності їх підписувати, завдяки використанню протоколу HTTPS.
Про серверну авторизація ВКонтакте використовуючи OAuth 2.0 я вже писав у цій статті на прикладі Sinatra. У цій статті мова про клієнтську авторизації на прикладі Mechanize.

Поїхали!

понеділок, 20 червня 2011 р.

Sinatra - Up and Running


Alan Harris і Konstantin Haase працюють над книгою Sinatra – Up and Running від O'Reilly, вихід якої запланований на серпень 2011 року. Приємно, що нарешті спільнота розробників Sinatra і Padrino матиме власну книгу. Попередньо замовити її можна тут.

Ось короткий опис книги:
Sinatra дає розробникам маленький але потужний і масштабований фреймворк для розробки веб-додатків на Ruby. Ця вступна книга дасть читачеві старт, допомагаючи йому створити, встановити і відшліфувати свій перший веб-додаток з Sinatra. Також вона досліджує, як Sinatra вписується в екосистему веб-додатків, головним чином у порівнянні з його більшим братом, Ruby On Rails.

пʼятниця, 17 червня 2011 р.

Використання will_paginate з DataMapper і Sinatra

Часто потрібно так, щоб у представлені(View) відображалися не усі записи з масиву на одній сторінці. У цьому випадку необхідно реалізувати розбиття на сторінки(pagination). Забезпечення цієї функціональності буде простішим з використанням плагіна WillPaginate, який є популярним у середовищі Rails-розробників. У цій статті мова піде про використання WillPaginate разом з Sinatra і DataMapper. Все що нам потрібно це версія >3.0 з підтримкою DataMapper.

Здійснюємо пошук
$ gem search will_paginate --remote
і встановлюємо необхідну версію
$ sudo gem install agnostic-will_paginate

За приклад ми візьмемо наш проект блогу із серії статей про Sinatra. Нашою задачею буде вивести на головну сторінку статті з розбивкою по сторінках.

четвер, 26 травня 2011 р.

Огляд Padrino і OmniAuth

У цій статті буде показано, як з’єднати модуль автентифікації Access Control, описаний тут, з OmniAuth middleware для Rack.

Система аутентифікації і контролю доступу Padrino забезпечує простий спосіб створювати свої системи аутентифікації. У поєднанні з OmniAuth ви можете легко використовувати її для аутентифікації за допомогою різних методів. Читайте нижче для більш докладної інформації про те, як інтегрувати їх.

У цій статті ми розглянемо дві теми:
  • Інтеграцію Padrino Admin Authentication в усі додатки вашого проекту
  • Створення власних стратегій аутентифікації

На відміну від оригінальної статті, де у якості ORM використовується ActiveRecord, тут ми будемо використовувати DataMapper, про який я писав тут. Можливо вам необхідно познайомитись з фреймворком Padrino, про який я писав тут і тут. І про OmniAuth тут.

Перш ніж ми почнемо, важливо відзначити, що наша вбудована аутентифікація, що базується на ролях, може взаємодіяти з іншими системами. Потрібно лише внести зміни у файли session.rb і account.rb для того щоб додати свій власний код.

Отже, давайте почнемо зі створення проекту використовуючи DataMapper:

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

Термінальний віконний менеджер Tmux

Майже кожен поважаючий себе linux'оїд знайомий з чудовою утилітою GNU Screen. Але у цій статті мова піде не про неї. А про її альтернативу Tmux, яка на мою думку є більш зручнішою.
Отже.
Tmux - це термінальний віконний менеджер, і мультиплексор. Тобто дозволяє використовувати декілька терміналів у одному. Tmux так само як і screen можна легко завести у фон, і так само легко повернутися до нього.

пʼятниця, 20 травня 2011 р.

OmniAuth: Зовнішня, проста автентифікація для Rack на прикладі Sinatra і ВКонтакте

В останні один-два роки веб-додатки зазнали радикальних змін. Час, коли кожен сайт представляв собою бункер, який чекає приходу нових користувачів поступово проходить. Я роздратовано зітхаю кожен раз, коли мені доводиться заповнювати чергову реєстраційну форму замість того, щоб скористатися "Connect with Facebook", "Sing in with Twitter" або "Log in with OpenID". Зараз веб-додатки стають все більш відкритими світу. Один з кращих способів збільшення популярності та життєздатності нового сервісу є його доповнення існуючими базами користувачів таких додатків, як: Twitter, Facebook, ВКонтакте, тощо.

Нещодавно я писав про авторизацію додатків ВКонтакте використовуючи відкритий протокол OAuth 2.0. У цій статті мова піде про OmniAuth.

OmniAuth - система аутентифікації заснована на Rack, яка значно спрощує зовнішню аутентифікацію в тому сенсі, що вам немає потреби розбиратися в API провайдерів, а також не вимагає ніякої інформації про те, що буде відбуватися з надіcланими після аутентифікації даними.

Що це означає для вас? Це означає, що ви можете легко реалізувати аутентифікацію в вашому додатку через Twitter, Facebook, LinkedIn, Google, GitHub, ВКонтакте, Mailru і т.д. І потім мати повний контроль над нею.

Запуск текстового редактора в IRB

Якщо ви працюєте з Ruby, ви знаєте, що interactive ruby shell (або IRB для стислості) - це командна оболонка для програмування на мові Ruby. Програма запускається з командного рядка і дозволяє виконувати команди мови Ruby в реальному часі. IRB є чудовою для випробування однорядкового коду, але якщо вам потрібно написати більше блоків, вона починає не справлятися з роботою. Якщо вам потрібно змінити або додати один рядок у блок коду, доводиться повторно вводити всі команди одна за одною. Відчувається, що інтерфейс командного рядка IRB є обмеженим у порівнянні з силою вашого текстового редактора. У цьому дописі я збираюся показати, як ви можете взяти найкраще з обох світів, шляхом завантаження текстового редактора всередині IRB для редагування і подальшого виконання коду.

Існує бібліотека Interactive editor, що забезпечує цю функціональність. Вона доступна через gem:
$ gem install interactive_editor
Далі необхідно створити файл ~/.irbrc, якщо у вас його ще немає, і вставити в нього наступний рядок:
require 'interactive_editor'
Тоді можете використовувати його в irb:

$ irb                        # або його альтернатива ripl
> vi                         # (використовувати vi з тимчасовим файлом)
> vi 'filename.rb'           # (відкрити filename.rb в vi)
> ed                         # (використувуваьт змінну оточення EDITOR)
> [emacs|vim|mvim|nano|mate] # (інші редактори)

Додаткові матеріали:

четвер, 19 травня 2011 р.

Як визначити країну по IP адресі

Щоб дізнатися країну з IP адреси слід встановити geoip gem:
$ gem install geoip
Потім завантажити базу даних GeoLite Country, яка є безкоштовною за умови GPL/LGPL для API.
Розпакувати її кудись і використовувати як хочете.
Приклад:
require 'geoip'
geoip = GeoIP.new('GeoIP.dat')
country_location = geoip.country('8.8.4.4')
puts country_location.country_code2 # => "US"

середа, 13 квітня 2011 р.

Авторизація ВКонтакте використовуючи OAuth 2.0 на прикладі Ruby і Sinatra

Віднедавна для авторизації додатків ВКонтакте використовується відкритий протокол OAuth 2.0. Тепер інтегрувати сайти і клієнтські програми з соціальною мережею стало значно простіше.
На сторінці з документацією нової системи авторизації написано, що підтримуються два типи авторизації: серверна і клієнтська.
У результаті проходження процесу авторизації вам видається ключ доступу access_token, з допомогою якого ви можете виконувати будь-які запити до API ВКонтакте від імені користувача або від імені додатку.
Не дивлячись на новизну протоколу OAuth 2.0, вже зараз на його сайті можна знайти бібліотеки для більшості популярних мов програмування, в тому числі і для Ruby
Крім появи підтримки OAuth у ВКонтакте змінився спосіб взаємодії з API. Тепер всі запити відправляються з безпечного протоколу HTTPS, в результаті чого зникла необхідність підписувати кожен запит.
Я не буду вдаватися у подробиці процесу авторизації. Про це можна почитати у документації ВКонтакте.
Нижченаведений код показує наскільки легко використовувати API ВКонтакте з OAuth2 gem в Ruby.

неділя, 3 квітня 2011 р.

Ruboto: Ruby на Android

Автор статті - Chris King, програміст, фрілансер.
Оригінал: http://www.ibm.com/developerworks/web/library/wa-ruby/

Вступ

Більшість цікавих робіт з розробки програмного забезпечення сьогодні відбуваються в одній із двох крайнощів: великі сервери хмарних обчислень і крихітні мобільні пристрої. Ці області вирішують значно несхожі проблеми, і, відповідно, мають різні засоби підтримки. Розробка для серверів часто використовує скриптові мови, щоб зв'язувати разом різні компоненти і виконувати складні автоматизовані завдання. В той час як розробка для мобільних пристроїв зосереджена на конкретних можливостях і потребах конкретного пристрою і користувача.

Однак, ці дві крайності об'єднує спільна мова: Java. Чи то мобільна платформа Android, чи фреймворк Spring, багатьма з найбільш популярних технологій сьогодні прийнято мову, яка здобула широке розповсюдження і підтримку в усьому світі. Ця спільна мова може призвести до деяких дивних взаємодії між областями, про які ви схильні думати як різні. Java відкриває двері для багатьох крос-платформових варіантів, таких як, легке портування коду сервера на пристрій Android або зв'язування у рідні здібності платформи з існуючих компонентів.

У цій статті розглядається Ruboto. Проект, який усуває розрив між скриптовими мовами і Android. Ви дізнаєтеся про Ruby і Android, як вони можуть разом прийти у віртуальну машину Dalvik, як створювати і розгортати власні скрипти, і чому ця технологія має потенціал для підвищення продуктивності праці програмістів і гнучкості застосування.

середа, 16 березня 2011 р.

Встановлення QtRuby з Ruby 1.9.2 на Ubuntu

Я використовую(і вам рекомендую) RVM (інструкція по встановленню на Ubuntu) і останню стабільну версію Ruby 1.9.2p180.

Спочатку встановлюємо необхідні пакети з репозиторію:
$ sudo apt-get install cmake libqt4-dev

Тоді переходимо до встановлення самого QtRuby:
$ sudo gem install qtbindings

Проект qtbindings - це набір "прив’язок" графічного фреймворку Qt4 для мови програмування Ruby, виконаний у вигляді пакету gem. У цілому він є перепакуванням підмножини Qt4 прив’язок до Ruby у формат, який добре піддається пакуванню в gem, що дозволяє легко встановити Qt "прив’язки" для Ruby на всіх платформах використовуючи RubyGems, і для забезпечення кращої сумісності між платформами.

Щоб побачити версію QtRuby, виконайте наступну команда:
$ rbqtapi -v
QtRuby 2.0.5 using Qt-4.7.0

Приклади додатків на QtRuby: /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/gems/1.9/gems/qtbindings-4.6.3.2/examples

вівторок, 15 березня 2011 р.

Nokogiri і XPath для розбору HTML таблиць

Вже третій місяць користуюся "Домашнім Інтернетом" від "Київстар". Система "Мій Київстар" дає змогу самостійно керувати своїми витратами в режимі онлайн. І звісно ж це вже потрібно автоматизувати. Для цього я буду використовувати наступні інструменти: Ruby, Mechanize, Nokogiri.

Аторизація на сайті Мій Київстар:

# -*- encoding: utf-8 -*-

require 'mechanize'
require 'nokogiri'

login    = '0010390***'
password = '***'

agent = Mechanize.new
agent.follow_meta_refresh = true

page = agent.get('https://my.kyivstar.ua/tbmb/login/perform.do')

login_form = page.form_with(:name => 'loginForm')
login_form.user     = login
login_form.password = password
show_page = agent.submit(login_form)

if show_page.uri.to_s == "https://my.kyivstar.ua/tbmb/disclaimer/show.do"
  puts "Login successful"
else
  puts "Login failure"
  exit
end

show_page_html = show_page.body.encode('utf-8', 'cp1251')

Розбір HTML таблиці використовуючи XPath:

doc = Nokogiri::HTML(show_page_html)
details = doc.search("//td[@id='mainContentBlock']/table/tr").collect do |row|
  title = row.at('td[1]').text.strip rescue ''
  data  = row.at('td[2]').text.strip.gsub("\n", " ") rescue ''
  {
    :title => title,
    :data  => data
  }
end

Вивід розпарсеної таблиці і поточного балансу:

pp details

balance = details.find {|e| e[:title] == "Поточний баланс:"}
puts "#{balance[:title]} #{balance[:data]}"

[{:title=>"Прізвище, ім'я, по-батькові:", :data=>"Іван Іванович"},
 {:title=>"Номер договору:", :data=>"0010390***"},
 {:title=>"Адреса підключення:", :data=>", Україна, Тернопіль"},
 {:title=>"Номер мобільного телефону:", :data=>"+38063*******"},
 {:title=>"Адреса електронної пошти:", :data=>"ivan.ivanovichlinux@gmail.com"},
 {:title=>nil, :data=>"Активуйте Вашу електронну адресу"},
 {:title=>nil, :data=>"Надіслати код активації"},
 {:title=>nil, :data=>nil},
 {:title=>"Особовий рахунок:", :data=>"0010390***"},
 {:title=>"Статус особового рахунка:", :data=>"Діючий"},
 {:title=>"Поточний баланс:", :data=>"55.09 грн."},
 {:title=>"Поріг відключення:", :data=>"0.0 грн."},
 {:title=>"Тарифний пакет:", :data=>"Турбо"},
 {:title=>"Статус послуги:", :data=>"Підключена"},
 {:title=>"Дата підключення:", :data=>"18.12.2010"}]
Поточний баланс: 55.09 грн.

неділя, 13 березня 2011 р.

Наскільки добре ви знаєте Ruby?

Відповідь на це питання можна отримати скориставшись сайтом rexaminator.com - онлайн симулятор іспиту, який допоможе вам перевірити і поліпшити свої знання мови програмування Ruby.

неділя, 20 лютого 2011 р.

Дві вразливості безпеки в Ruby



Цього тижня виявлено дві досить небезпечних вразливості, які присутні в усіх поточних версіях Ruby. Перша, вразливість в FileUtils.remove_entry_secure впливає як на 1.8,так і на 1.9 гілку, а друга, в режимі $SAFE, впливає тільки на 1.8.

Urabe Shyouhei з основної команди Ruby оголосив, що Fileutils вразливий для symlink race атак. Вразливість присутня у наступних версіях Ruby:

  • 1.8.6-p420 і попередні
  • 1.8.7-p330 і попередні
  • розроблювана версія 1.8 (1.8.8dev)
  • 1.9-p430 і попередні
  • 1.9.2-p136 і попередні
  • розроблювана версія 1.9 (1.9.3dev)

Вразливість з $SAFE присутня у наступних версіях Ruby:
  • 1.8.6-p420 і попередні
  • 1.8.7-p330 і попередні
  • розроблювана версія 1.8 (1.8.8dev)

Свята простота: краще оновити швидше!
Безсумнівно у вас є власні способи і засоби виконання оновлень (з використанням RVM, наприклад), проте завжди є можливість завантажити і скомпілювати останню версію Ruby з офіційного сайту:
Ruby 1.8.7-p334: http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.gz
Ruby 1.9.1-p431: http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p431.tar.gz
Ruby 1.9.2-p180: http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz

>>> Подробиці

четвер, 17 лютого 2011 р.

Використання Sinatra з Bundler для розгортання додатку на Heroku

Хотів почати із зачаровуючого та інтригуючого заголовку. І, безумовно, заголовок повинен відповідати вмісту статі.
Веб-фреймворк Sinatra не потребує повторного представлення. Я писав про нього раніше у цьому блозі. В цій статті мова піде про два інші інструменти згадані у заголовку.

Що таке Bundler?
Це менеджер для управління залежностями gem'ів в ruby додатках. Ця утиліта дозволяє легко встановлювати необхідні gem'и для вашої програми, при цьому зовсім не залежати від встановлених в системі.
Встановлюємо цю утиліту як будь-який інший gem:
$ gem install bundler

Для використання Bundler з Sinatra, потрібно зробити дві речі.

четвер, 10 лютого 2011 р.

I'm alive! - 2011

Давненько сюди не писав. Просто не було настрою.
Це буде перший запис у новому 2011, році який надіюсь буде не менш багатий на події ніж попередній. Світ Ruby у 2010 був багатим на події та нові релізи. Найбільш помітні з них на мою думку:
Хочеться вірити у цьому році ця тенденція збережеться.

Стосовно цього блогу, в найближчих планах мабуть написати щось про QtRuby.

Схожі записи: