Показ дописів із міткою ruby. Показати всі дописи
Показ дописів із міткою ruby. Показати всі дописи

неділя, 20 жовтня 2013 р.

Magento REST API і OAuth в Ruby

У цій статті я хочу поділитися прикладом роботи з Magento REST API використовуючи Ruby і oauth gem. У свій час пошуки подібного ні до чого не привели.

Докладна документація по Magento REST API тут.

Реєстрація та уповноваженому додатку


Отже, приступимо. Першим ділом, потрібно отримати всі потрібні параметри для авторизації. Зокрема ключі consumer_key і consumer_secret. І, власне хост(magentohost), на якому встановлене Magento.

Скажу відразу, налаштування платформи Magento для REST API не розглядається в рамках цієї статті.

пʼятниця, 13 вересня 2013 р.

Зі святом, програмісти!

П'ятниця 13-го. День програміста. Програмістів з відьмами об'єднує не тільки бубен для магічної тряски, а і святкова п'ятницю для шабашу.
Зі Святом, товариші!

Наскільки часто буває такий збіг?
Відповідь під катом.

понеділок, 15 липня 2013 р.

Книга по Ruby 2.0

Алекcандр Круглов виклав у вільний доступ книгу "Ruby" по мові програмування Ruby 2.0.

Якщо я не помиляюся, це перша опенсорс книга про Ruby російською мовою.

Текст книги у форматі PDF доступний за наступним посиланням. Зі змістом можна ознайомитися тут.

Книгу можна зібрати з вихідних кодів:
  1. Встановити Ruby.
  2. Встановити необхідні пакети: gem install redcarpet.
  3. Завантажити скрипт для перетворення Markdown в LaTeX.
  4. Встановити XeLaTeX.
  5. Завантажити стиль.
  6. Зібрати pdf: xelatex book.tex (за замовчуванням використовуються шрифти сімейства Liberation).

>>> Новина взята з LOR.

вівторок, 30 квітня 2013 р.

Отримання улюблених аудіозаписів з Last.fm

Почитав тут статтю Получение любимых аудиозаписей с pandora.com, подумав і придумав subj.
Отже, з Last.fm будемо отримувати список назв пісень і виконавців, потім за допомогою API ВКонтакте будемо їх скачувати.

Крок 1. Йдем на Last.fm, і витягуємо список улюблених пісень користувача.

Для тих хто не знає, Last.fm має API, що дозволяє будь-якому користувачеві створювати свої власні програми з використанням даних Last.fm. Для роботи з API потрібно отримати API Key і Secret. Йдемо на http://www.last.fm/api і створюємо новий аккаунт для некомерційного використання.

ruby-lastfm - інтерфейс для Web-сервісів Last.fm v2.0.
Тепер нам потрібно отримати token:
lastfm = Lastfm.new(lastfm_api_key, lastfm_api_secret)
lastfm_token = lastfm.auth.get_token

Далі нам пропонують відкрити 'http://www.last.fm/api/auth/?api_key=xxxxxxxxxxx&token=xxxxxxxx' і надати права додатку.

Спробуємо змоделювати цей запит. Але спочатку потрібно авторизуватися на сайті Last.fm за допомогою імені і паролю. Використовуємо бібліотеку Mechanize:
mech = Mechanize.new do |a|
  a.user_agent_alias = 'Linux Firefox'
  a.verify_mode = OpenSSL::SSL::VERIFY_NONE
  a.follow_meta_refresh = true
end

login_page = mech.get('https://last.fm/login')
login_form = login_page.form_with(action: '/login')

login_form.username = lastfm_username
login_form.password = lastfm_password

page = login_form.submit

if page.uri.to_s == 'http://www.last.fm/home'
  puts "Login successful!"
else
  puts page.uri.to_s
  exit
end

Якщо авторизація пройшла успішно, надаємо права додатку:
grantaccess_url = "http://www.last.fm/api/auth/?api_key=#{lastfm_api_key}&token=#{lastfm_token}"
grantaccess_page = mech.get(grantaccess_url)

grantaccess_form = grantaccess_page.form_with(action: '/api/grantaccess')
grantaccess_form.submit

Отже, тепер ми можемо витягнути всю цікаву для нас інформацію:
lastfm.session = lastfm.auth.get_session(:token => lastfm_token)['key']
tracks = lastfm.user.get_loved_tracks(user: lastfm_username)

Перший крок пройдений! :)

Крок другий. Пошук і скачування записів з vk.com.
Авторизуємося ВКонаткте:
vk = Vkontakte::Client.new(vk_client_id)
vk.login!(vk_email, vk_password, scope = 'audio')

Використовуємо API функцію пошуку аудіо:
str = "#{track['artist']['name']} - #{track['name']}"
audio = vk.api.audio_search(q: str, sort: 2)[1]

Вона повертає найпопулярніший результат пошуку рядка str (серед аудіозаписів).

Тепер ми знаємо url для скачування. Завантажити можна за допомогою стандартної функції.
path = "#{downloaded_folder}/" + "#{audio['artist']} - #{audio['title']}.mp3"
File.open(path, 'wb') do |saved_file|
  open(audio['url'], 'rb') do |read_file|
    saved_file.write(read_file.read)
  end
end

В результаті вийшов ось такий скрипт:
https://gist.github.com/mamantoha/5488722

Як з ним працювати:
  • Скрипт вимагає встановленого Ruby і гемів mechanize, ruby-lastfm, vkontakte
  • Потрібно отримати ключі для Last.fm(lastfm_api_key, lastfm_secret) і ВКонтакте(vk_client_id)
  • downloaded_folder - директорія, куди буде зберігатися скачана музика
  • lastfm_username і lastfm_password - ваш логін і пароль на Last.fm
  • vk_email і vk_password - ваш логін і пароль на Vk.com

Відповідні параметри прописати в тілі скрипта.

субота, 19 січня 2013 р.

Використовуємо life:) API за допомогою Ruby


У цій статті я хочу розповісти Вам, як на мові Ruby налагодити взаємодію з life:) API. Для тих хто не в курсі, life:) — український GSM-оператор мобільного зв'язку.

Все почалося тоді, що коли у офіційному твітері life:) з'явилося повідомлення про додаток "Мій life:)" для Android. Мені відразу стало цікаво — а як вони отримують інформацію, якщо не через свій сайт системи самообслуговування для індивідуальних абонентів Мій life:).

Добрі люди підказали мені, як декомпілювати файл apk. Але це не тема цієї статті.

Трохи покопавшись в горах Java-коду, мені вдалося зрозуміти за яким принципом здійснюється робота з сервісом life:). Варто зауважити, що офіційно нікого API у life:) немає. Тому все нижче написане використовуйте на свій страх і ризик.

Результатом цієї роботи стала бібліотека для Ruby - life-api, яка реалізує деякі методи API. Ви можете знайти її на Github.

Отже, що нам знадобиться щоб виконувати запити?
Розглянемо все по порядку.

Всі запити, включаючи авторизацію виконується до адреси https://api.life.com.ua/mobile.
З кожним запитом передається постійний ключ API accessKeyCode. А applicationKey використовується, як секретний ключ для підписання запиту. Про це трохи пізніше.

понеділок, 31 грудня 2012 р.

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



2012 рік добігає кінця. І за хорошою традицією в останньому записі я згадую найбільш значущі події в світі Ruby, що відбулися у цьому році.

Цього року формат статті зазнав деяких змін. Події розбиті по місяцях.

Січень
  • Випуск KidsRuby 1.0, редактора Ruby розробленого в освітніх цілях для дітей дошкільного й молодшого шкільного віку (але не менш корисного для дорослих). Він включає в себе навчальні посібники та графічну систему в стилі мови програмування Logo для більш наочного типу навчання.

Лютий

Березень
  • FXRuby - Ruby bindings для FOX (крос-платформної бібліотеки з відкритим вихідним кодом для побудови графічного інтерфейсу) повернувся з довгого періоду застою.
  •  Юкіхіро Мацумото (Yukihiro Matsumoto), автору мови програмування Ruby, присуджена премія "Free Software Awards 2011" номінації, що вручається за просування і розвиток вільного ПЗ.
  • Ruby став стандартом ISO.
    Після чотирьох років розробки, 31 березня цього року за результатами голосування Ruby версії 1.8 був прийнятий як стандарт ISO/IEC 30170. Будемо сподіватися, що наступну версію стандарту підготують швидше.
Квітень
  • mruby - полегшена реалізації мови Ruby, виконана за ISO стандартом для виконання різних середовищах. Може були як виконана інтерпретатором так і бути скомпільованою і виконаною віртуальною машиною,  відповідно до його модульної конструкції.
  • MobiRuby - інструментарій для створеня IOS додатків за допомогою мови Ruby. В майбутньому планується підтримка Android.
Травень
  • Компанія Red Hat запустила нову хмарну платформу OpenShift з підтримкою Java, Ruby, Node, Python, PHP і Perl.
  • Два ключових розробника команди JRuby(Thomas Enebo і Charles Nutter) переходять на роботу в Red Hat.
  • Перший попередній реліз JRuby 1.7. Цікавий тим, що це перший реліз з підтримкою  InvokeDynamic - рішення, що дозволяє взаємодіяти з динамічними мовами практично без втрати продуктивності.
  • Реліз RubyMotion - набір інструментів для IOS, який дозволяє швидко розробляти і тестувати власні програми для iPhone або iPad, за допомогою Ruby.
Червень
  • Вийшла ювілейна версія 1.0 бібліотеки R18n, яка дозволяє додати в додаток на Rails/Ruby підтримку декількох мов (i18n).
  • Реліз Sublime Text 2.0
Вересень

Жовтень
Листопад
Грудень
  • Heroku додали офіційну підтримку для JRuby

2013 рік обіцяє також бути багатим на нові релізи. Зокрема Ruby 2.0 і Rails 4.0.

Щиро вітаю Вас з наступаючим Новим Роком!
Нехай він принесе нам довгождане щастя, спокій, добробут, палке кохання, міцне здоров'я та здійснення наших самих заповітних мрій!

    пʼятниця, 28 грудня 2012 р.

    Історія одного тупняку, або як я конвертував DBF в SQLite3

    Нещодавно до мене потрапив файл у форматі dbf з досить цікавою інформацією. Але сьогодні не про це.

    Для роботи з цією інформацією, я вирішив імпортувати таблицю DBF у SQLite3. Використовувати сторонній софт для такої тривіальної задачки — це не наш варіант. Ми не шукаємо легких шляхів. Напишемо скрипт самі. Писати, звичайно, будемо на Ruby.

    DBF — застаріваючий формат зберігання даних, який (був?) широко розповсюджений на пострадянському просторі.

    Недовгі пошуки навели на бібліотеку dbf. Як описує її автор, це невелика швидка бібліотека для читання DBase, Xbase, Clipper і FoxPro файлів баз даних.

    Відкриваємо DBF файл:
    require 'dbf'
    dbf_table = DBF::Table.new(dbf_file, nil)
    dbf_columns = dbf_table.columns
    
    І відразу отримуємо помилку:
    dbf-2.0.3/lib/dbf/column/base.rb:19:in `initialize': column name cannot be empty (DBF::Column::NameError)
    

    Проблема виникає через те, що при ініціалізації поля, у його назві відсікаються всі не-ASCII символи. А такий порядок речей в моєму випадку недопустимий, оскільки
    імена полів у DBF таблиці записані кирилицею у кодуванні cp1251.

    Тут стане у нагоді "monkey patching".
    Ініціалізуємо таблицю у кодуванні cp1251 і конверуємо імена полів в utf-8:

    module DBF
      module Column
        class Base
          attr_reader :name, :type, :length, :decimal
    
          def initialize(name, type, length, decimal, version, encoding = nil)
            @name, @type, @length, @decimal, @version, @encoding = clean(name, encoding), type, length, decimal, version, encoding
    
            raise LengthError, "field length must be greater than 0" unless length > 0
            raise NameError, "column name cannot be empty" if @name.length == 0
          end
    
          def clean(value, encoding)
            value.force_encoding(encoding).encode('utf-8')
          end
    
        end
      end
    end
    
    dbf_table = DBF::Table.new(dbf_file, nil, 'cp1251')
    dbf_columns = dbf_table.columns
    

    Не вдаючись в подробиці створення схеми SQLite3 (повний код скрипта Ви знайдете в кінці статті), перейдемо відразу до імпорту. Задачка звичайно зовсім тривіальна і написання рішення займає лічені хвилини.
    dbf_table.each do |record|
      sqlite_db.execute("INSERT INTO the_table VALUES (?,?,?,?,?,?)", record.attributes.values)
    end
    
    Тут можна було б піти покурити, попити чаю або кави чи навіть подивитися фільм. Даний процес зайняв досить багато часу.
    Час роботи такого рішення мене не вдовольняв зовсім.
    Бувалі програмісти мабуть відразу зрозуміють де собака зарита. Але цей тупняк поглинув мене на кілька годин.
    Спочатку я грішив на повільність бібліотеки dbf. Але цей варіант був швидко відкинутий. Каменем спотикання була саме бібліотека SQLite3.
    Наступну годину я курив, пив пиво і дивився "Ruby Sparks". Між іншим красивий і милий романтичний фільм, але настирливий продакт-плейсмент Apple вже бісить. Паралельно ґвалтува ґуґл в пошуках рішення. І ось воно зійшло:
    sql_db.transaction do |db|
      dbf_table.each do |record|
        db.execute("INSERT INTO the_table VALUES (?,?,?,?,?,?)", record.attributes.values)
      end
    end
    

    Несподівано скрипт, який виконувався годинами, виконався за 10 секунд. Підвищення продуктивності over 9000%. Я отетерів(!) від такого результату.

    Мораль цієї історії проста... Комусь здається, що це тривіально, але мені просто хотілось поділитися з кимось цими думками.

    Нище ви знайдете повну версію скрипта для конвертування DBF у SQLite3.

    четвер, 27 грудня 2012 р.

    Робота з файлами eml в Ruby

    Сьогодні зіткнувся з проблемою пошуку вкладень серед багатьох файлів з розширенням eml.

    Формат eml використовується багатьма клієнтами електронної пошти, включаючи Microsoft Outlook Express, Windows Mail і Mozilla Thunderbird. Це звичайний текстовий файл у форматі MIME, що містять заголовки повідомлень електронної пошти, а також вміст повідомлення та вкладення.

    Відкрити його під Linux не складає труднощів, наприклад, за допомогою поштового клієнта KMail, однак таке рішення мені здалося занадто складним.

    Трохи погугливши, виявилося, що бібліотека email чудово вміє розбирати такі файли.

    В результаті вийшов невеликий скрипт, який вибирає всі файли з розширенням eml у поточній директорії, і відображає в консолі текстовий вміст листа, а прикріплені файли зберігає у відповідних директоріях.
    require 'mail'
    
    Dir.glob('*.eml') do |filename|
      mail = Mail.read(filename)
    
      puts <<EOF
      From:    #{mail.from}
      To:      #{mail.to}
      Subject: #{mail.subject}
      Date:    #{mail.date}
    
    EOF
    
      charset = mail.text_part.content_type_parameters['charset']
      puts mail.text_part.body.decoded.force_encoding(charset).encode('utf-8')
    
      if mail.multipart?
        dir = File.basename(filename, File.extname(filename))
        Dir.mkdir(dir) if !Dir.exists?(dir)
    
        mail.attachments.each do |attachment|
          file = File.open(dir + '/' + attachment.filename, 'wb') { |f| f.write attachment.body.decoded }
          puts "Saving `#{attachment.filename}`"
        end
      end
    
      puts "===\n\n"
    end
    

    понеділок, 29 жовтня 2012 р.

    Opal — реалізація Ruby на JavaScript

    Opal — реалізація Ruby, написана на мові JavaScript.

    Opal включає в себе компілятор (який можна запустити в будь-якому браузері), основну бібліотеку і середовища виконання. У стисненому вигляді основна бібліотека і середовище виконання займають всього-на-всього 10.8kb.

    вівторок, 23 жовтня 2012 р.

    Ruby Bits.Частина 2


    Для багатьох не секрет, що Ruby — це потужна мова програмування. Але чи використовуєте ви її в повній мірі?
    У другій частині курсу від Code School ви зможете познайомитися з найбільш корисними можливостями метапрограмування у Ruby.

    У цьому курсі ви дізнаєтеся про:
    • Використання Procs і лямбда для зберігання і виконання блоків коду
    • Різні способи для передачі блоків у методи
    • Як використовувати необов'язкові блоки
    • Динамічне визначення та виклик методів
    • Відповідь на неіснуючі методи
    • Управління контекстом, в якому виконується код

    В кінці курсу, ви зможете використовувати вивчені можливості для побудови Domain Specific Languages(DSL).

    >>> Перейти до курсу

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

    Ruby 1.9.3-p286

    Новий реліз включає в себе виправлення кількох критичних помилок, і не містить нових можливостей.
    Докладніше на офіційній сторінці.

    Для Linux:
    $ rvm get head
    
    $ rvm upgrade ruby
    Are you sure you wish to upgrade from ruby-1.9.3-p194 to ruby-1.9.3-p286? (Y/n):
    

    Для Windows доступний для завантаження RubyInstaller 1.9.3-p286.

    вівторок, 9 жовтня 2012 р.

    Курс по Ruby на Codecademy

    На навчальному порталі Codecademy з'явився курс з мови програмування Ruby.

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

    Курс можна рекомендувати, тим, хто тільки починає вивчення Ruby.

    Курс на англійській, але на простій і зрозумілій.


    вівторок, 3 липня 2012 р.

    ВКонтакте → Авторизація додатків з Ruby і Net::HTTP

    На днях виникло бажання переписати код своєї бібліотеки для для авторизації ВКонтакте і здійснення запитів до API, використовуючи тільки стандартні модулі Ruby.

    Для того, щоб прикинутися справжнім браузером, просто завантажувати потрібні сторінки недостатньо. Як мінімум, потрібно коректно обробляти куки і редіректи. Для цього у попередній статі я використовував чудову бібліотеку Mechanize.

    Спочатку встановимо необхідні параметри.

    Детально про параметри звернення можна прочитати в документації.
    client_id - ідентифікатор вашого додатку.
    Тут слід зазначити, що ми будемо використовувати параметр display із значенням wap, так в цьому варіанті сторінки практично відсутній JavaScript.
    scope являє собою список прав, до яких ми хочемо отримати доступ.

    Звертаємося до сторінки авторизації




    Парсимо відповідь


    Подивимося на код сторінки авторизації. Найбільше нас буде цікавити наступна частина:


    Для подальшої відправки форми необхідно розпарсити всі input'и (и тому числі і приховані), а також URL, на який сабмітиться форма.


    Авторизуємось


    Підставляємо в параметри запиту електронну пошту та пароль користувача і відправляємо форму:


    Отримуємо куку




    Встановлюємо куку




    Отримуємо код


    Наступним етапом, якщо користувач цього ще не робив, треба дати додатку ті права, які ми запитували в параметрі scope. Для цього нам буде запропонована сторінка з формою.

    В результаті отримуємо відповідь наступного вигляду:
    http://oauth.vk.com/blank.html#code=xxxxxxxxxxxxxxxxxx



    Даний метод авторизації не є офіційним і може змінитися.

    вівторок, 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
    

    неділя, 29 квітня 2012 р.

    Стрімінг в Sinatra

    Починаючи з 1.3.0, Sinatra підтримує стрімінг(streaming API). В інтернеті ви точно стикалися з його реалізацією. Наприклад стрічка Twitter чи новини ВКонтакте.

    Іноді потрібно почати відправляти дані клієнту прямо в процесі генерування частин цих даних. В особливих випадках потрібно постійно відправляти дані до тих пір, поки клієнт не закриє з'єднання. Ви можете використовувати метод stream замість написання власних "обгорток".

    Почнемо з класичного прикладу з документації Sinatra:
    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
    

    Якщо сервер не підтримує стрімінг (наприклад, WEBRick), то всі дані будуть відправлені за один раз відразу після того, як блок, переданий в stream, завершиться.