14 лютого 2012 р.

Sinatra: Up and Running.pdf

Sinatra: Up and Running

Ruby for the Web, Simply

By Alan Harris, Konstantin Haase

Publisher: O'Reilly Media
Released: November 2011
Pages: 120


Скачати безкоштовно без реєстрації та смс даром на халяву
Get this torrent ( Torrent File)

13 лютого 2012 р.

Налаштування will_paginate для Bootstrap у Sinatra

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

Крім того вийшла версія will_paginate 3.0.3, у яку крім усього іншого також ввійшов коміт, що виправляв кілька багів пов'язаних з DataMapper.
І у зв'язку з цієї радісною новиною, я вирішив прикрутити пагінацію до свого проекту на Sinatra, у якому, як ви вже мабуть здогадалися використовується Bootstrap.

Підключаємо необхідні бібліотеки:
require 'will_paginate'
require 'will_paginate/data_mapper'

Вказуємо will_paginate генерувати теги у стилі Bootstrap:
class BootstrapLinkRenderer < ::WillPaginate::Sinatra::LinkRenderer
  protected
  
  def html_container(html)
    tag :div, tag(:ul, html), container_attributes
  end

  def page_number(page)
    tag :li, link(page, page, :rel => rel_value(page)), :class => ('active' if page == current_page)
  end

  def gap
    tag :li, link(super, '#'), :class => 'disabled'
  end

  def previous_or_next_page(page, text, classname)
    tag :li, link(text, page || '#'), :class => [classname[0..3], classname, ('disabled' unless page)].join(' ')
  end
end

І на останок пишемо помічник, який дозволить виводити навігацію у простій формі:
== page_navigation_links @events

helpers do

  def page_navigation_links(pages)
    will_paginate(pages, :class => 'pagination', :inner_window => 2, :outer_window => 0, :renderer => BootstrapLinkRenderer, :previous_label => '&larr;', :next_label => '&rarr;')
  end

end

11 січня 2012 р.

Проблема з авторизацією ВКонтакте через OAuth2

Сьогодні стикнувся з помилкою при авторизації по OAuth ВКонтакте:
{"error":"invalid_request","error_description":"redirect_uri is incorrect"}
Виявляється, треба просто вказати правильний домен. Раніше якимось чином все працювало з невірним доменом.


10 січня 2012 р.

Іменовані аргументи функції в Ruby 2.0

В Ruby 1.9 іменовані аргументи представляють із себе просто останній аргумент з хешем, як значенням по замовчуванню, і розширення граматики, за допомогою якого ініціалізується цей хеш. Мало хто знає, що в 1.9 можна зробити метод, наприклад:
def a(opts = {}); end
і викликати його як
a(go: true, what: "string")

В trunk Ruby 2.0 додали іменовані аргументи(keyword arguments) - простий спосіб вказати такий запис при визначенні методу. Наприклад:
def step (by: step, to: limit)
  ...
end

1.step (by: 2, to: 20) do |i|
  p i
end

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. Він пропонує альтернативу більш звичної пари значень хеш і сіль, які зберігаються у базі даних.