вівторок, 22 травня 2012 р.

CarrierWave з DataMapper у Sinatra

У вільний час займаюся розробкою веб-додатку на Sinatra з використанням DataMapper. І ось задався питанням завантаження аватарів на сервер та їх після-обробкою.

Переглянувши доступні інструменти для забезпечення цієї функціональності, вибір впав на бібліотеку CarrierWave, яка на відміну від більшості інших не зав'язана на Rails/ActiveRecord.

CarrierWave описує себе, як "першокласне рішення для завантаження файлів для Rails, Sinatra та інших веб-додатків на основі Rack". Проект був започаткований у серпні 2008 року, і перший випуск відбувся в березні 2009 року. Перша його назва була Merb::Upload і він був без підтримки Rails.

Той факт, що CarrierWave почав своє життя в якості плагіна для Merb може пояснити його модульність, гнучкість і розширюваність.

Завдяки fog, він має підтримку Amazon S3, Rackspace Cloud Files і Google Storage for Developers. Він також підтримує звичайне зберігання файлів і GridFS в MongoDB.
Має підтримку незліченної кількості ORM: ActiveRecord, Mongoid, DataMapper, Sequel, MongoMapper, CouchDB.
Обробка зображення доступна засобами RMagick, ImageScience або MiniMagick.
Сама по собі ця бібліотека дуже добре документована, і якщо раптом когось цікавлять деталі, то читайте wiki.

У цій статті для прикладу ми напишемо просту фотогалерею.
Наступні gem`и повинні бути встановлені:
  • sinatra
  • datamapper
  • dm-sqlite-adapter
  • slim
  • carrierwave - для завантаження зображень
  • carrierwave-datamapper - для зв'язку DataMapper і CarrierWave
  • rmagick - для створення мініатюр зображень(в Ubuntu потрібно встановити пакет libmagick++-dev)

пʼятницю, 18 травня 2012 р.

Розгортання додатку Sinatra на OpenShift

Red Hat OpenShift - це нова, вільно-масштабована "платформа як послуга(Platform as a service, PaaS) для розробки веб-додатків. На даний момент підтримує Java, Ruby, Node, Python, PHP і Perl.

Картриджі - це компоненти додатку OpenShift, які включають в себе бази даних(MySQL, PostgreSQL, MongoDB) та інші утиліти(Cron, phpMyAdmin, RockMongo, OpenShift Metrics). Додавання картриджа у додаток забезпечує бажану функціональність.

Для початку необхідно зареєструватися на сайті https://openshift.redhat.com і створити новий додаток.
Вибрати тип додатку(в нашому випадку це Ruby 1.8.7). Вказати ім'я додатку і простір імен.
Вітання, тепер ви у хмарах!
Новий додаток буде доступний за URL виду:
http://<ім'я додатку>-<простір імен>.rhcloud.com

OpenShift використовує розподілену система керування версіями коду Git. Коли ви внесете зміни у віддалений репозиторій, сервіс автоматично розгорне ваш код і перевантажить додаток якщо необхідно.

четвер, 17 травня 2012 р.

Ведення логів у Mechanize

Для того, щоб проаналізувати, що пішло не так, коли Mechanize викликає виключення, виникає необхідність ведення логів. Mechanize може реєструвати практично будь-які події, включаючи заголовки запитів. Для цього потрібно передати екземпляр класу Logger у метод Mechanize#log.
# -*- encoding: utf-8 -*-

require 'mechanize'
require 'logger'

log = Logger.new($stderr)
log.level = Logger::DEBUG

agent = Mechanize.new do |a|
  a.log = log
end

agent.get('http://google.com')
Отриману інформацію надалі можна використати для аналізу подій, виявлення помилок та збоїв.
https://gist.github.com/2718143#file_mechanize1.log
Офіційна документація по класу Logger

Також існує менш відомий, але не менш корисний спосіб ведення логів за допомогою методу Mechanize#agent.http.debug_output:
# -*- encoding: utf-8 -*-

require 'mechanize'

agent = Mechanize.new do |a|
  a.agent.http.debug_output = $stderr
end

agent.get('http://google.com')
https://gist.github.com/2718143#file_mechanize2.log

Оновлюємо статус ВКонтакте за допомогою Ruby

Сьогодні вечором виникло бажання, щоб на моїй сторінці ВКонтакте відображався таймер зворотнього відліку до початку Євро-2012 прямо в статусі. Написати простенький скрипт на Ruby для такого достатньо просто.
З інструментів я використовував свою бібліотеку для роботи з API ВКонтакте. Якщо комусь цікаво, як вона працює, можете почитати статтю ВКонтакте → Авторизація Standalone-додатків використовуючи OAuth 2.0 на прикладі Ruby і Mechanize.

Не вдаючись в подробиці, ось посилання на приклад скрипта.

Здавалось би залишилось додати скрипт у cron і насолоджуватись результатом.
Наступний рядок у /etc/crontab не приніс бажаних результатів.
*/1 * * * * user ruby /home/user/days_to_euro.rb
Скрипт всього-на-всього не виконувався.
Причиною проблеми виявився Ruby Version Manager(RVM). Змінюємо на наступний рядок.
*/1 * * * * user bash -c 'source /home/user/.rvm/scripts/rvm && /usr/bin/env ruby /home/user/days_to_euro.rb'

І вуаля: тепер скрипт успішно виконується і так же успішно завершує роботу з помилкою:
`default_gemfile': Could not locate Gemfile (Bundler::GemfileNotFound)
Це відбувається тому, Bundler шукає Gemfile в каталозі в якому виконується, а Gemfile там звісно ж немає.
Потрібно вказати де шукати Gemfile.
ENV['BUNDLE_GEMFILE'] = File.join(File.dirname(__FILE__) ,'Gemfile')
Вищевказаний рядок потрібно додати у шапку скрипта.

Тепер все добре і скрипт працює.

P.S. До Євро-2012 залишилось 21 день 23 години 43 хвилини

неділю, 13 травня 2012 р.

QtRuby: позиціювання віджетів

У цій статті, ми познайомимося з основами розміщенням віджетів у вікні додатку QtRuby.

Коли ми розробляємо графічний інтерфейс додатку, ми вирішуємо, які компоненти ми будемо використовувати і як ми будемо організовувати ці компоненти. Щоб організувати компоненти, ми використовуємо спеціальні невидимі ​​об'єкти, так звані менеджери компонування(layout managers).
Qt надає кілька варіантів. Ми можемо використовувати абсолютне позиціювання, вбудовані менеджери компонування або створити власний менеджер компонування. Також ми також можемо візуально будувати макети допомогою Qt Designer.

суботу, 12 травня 2012 р.

Введення в QtRuby

Ця стаття є введенням в програмування графічного інтерфейсу користувача(GUI) з використанням бібліотеки Qt, мови Ruby, і qt4-qtruby.

Якщо ви раніше ніколи не користувалися Qt, рекомендую почитати документ Як вивчати Qt. Не забувайте, що, як і більшість статей про Qt, ця сильно орієнтована на C++.

Найкращий спосіб почати програмувати з QtRuby це ознайомитися з прикладами коду, які знаходяться в директорії qtruby/examples.

Для початку розімнемо пальці. А саме напишемо Hello World. Куди ж ми без нього? Він містить тільки необхідний мінімум, що отримати робочий Qt додаток.
# -*- encoding: utf-8 -*-

require 'Qt'

app = Qt::Application.new(ARGV)
hello = Qt::PushButton.new("Hello World!")
hello.resize(100, 30)
hello.show
app.exec

пʼятницю, 11 травня 2012 р.

Інсталяція QtRuby з Ruby 1.9.3 на Ubuntu 12.04

  • Ubuntu 12.04 LTS
  • Остання версія Ruby 1.9.3p194 зібрана з RVM
  • Qt 4.8.1 з репозиторію
  • Остання стабільна версія QtRuby 2.2.0
sudo apt-get install cmake libqt4-dev libqwt5-qt4-dev libqscintilla2-dev libsmokeqt4-dev
wget http://rubyforge.org/frs/download.php/75633/qt4-qtruby-2.2.0.tar.gz
tar xzvf qt4-qtruby-2.2.0.tar.gz
cd qt4-qtruby-2.2.0/
cmake .
make
sudo make install
sudo ldconfig /usr/local/lib/