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

вівторок, 29 жовтня 2013 р.

Magento XML-RPC API і Ruby

Після написання першої статті Magento REST API і OAuth в Ruby, захотілося продовжити вивчення можливостей Magento API.
Весь сир-бор через те, що можливості REST в Magento просто жалюгідні.
На сьогодні Magento підтримує всі найбільш поширені способи доступу до API сайтів: REST, XML-RPC, SOAP.

Magento SOAP/XML-RPC API дає вам можливість керувати своїми магазинами електронної комерції, забезпечуючи методи для роботи з ресурсами, такими як клієнти, категорій, продукти і замовлення.

Про SOAP можна говорити багато і довго.
Для мене основними мінусами стали складність протоколу і відсутність вбудованої підтримки в Ruby.
Натомість стандарт XML-RPC зачарував мене своєю надзвичайною простотою.
В базову поставку Ruby вже входить бібліотека для роботи з XML-RPC, відповідно вам не доведеться замислюватися про структуру запитів і обробку відповідей в XML.

Тому саме XML-RPC в основному і буде присвячена ця стаття.
Не буду зупинятися на питанні, що таке XML-RPC і навіщо він потрібен. У мережі багато статей на цю тему.

Просто постараюся коротко показати, яким простим способом можливе створення клієнта до XML-RPC веб-сервісу на Ruby.
require 'xmlrpc/client'

config = {
  api_user: 'user',
  api_key:  'secret',
  host:     'example.com',
  path:     '/api/xmlrpc',
  port:     80,
}
client = XMLRPC::Client.new(config[:host], config[:path], config[:port])

# If somestuff requires api authentification,
# we should get session token
session = client.call('login', config[:api_user], config[:api_key])

parent_id = 1
store_view = 1
client.call('call', session, 'catalog_category.tree', [parent_id , store_view])

# If you don't need the session anymore
client.call('endSession', session)

Все просто: ми підключаємося до сервера, отримуємо ключ сесії і виконуємо запити.

Документацію по всіх запитах Magento API можна знайти на офіційному сайті.
XML-RPC підтримується тільки першою версією Magento API.

неділя, 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 не розглядається в рамках цієї статті.

пʼятниця, 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. Коли ви внесете зміни у віддалений репозиторій, сервіс автоматично розгорне ваш код і перевантажить додаток якщо необхідно.

субота, 24 березня 2012 р.

Стилістика написання коду Ruby

Пару днів назад на GitHub створили спеціальний розділ, присвячений стилям написання коду. Доступні рекомендації для наступних мов:

Для Ruby багато що було взято з https://github.com/bbatsov/ruby-style-guide.

пʼятниця, 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

середа, 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 р.

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

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

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

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

четвер, 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

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

субота, 28 листопада 2009 р.

RESTful Sinatra

Попередні статті:
  1. Привіт, Sinatra!
  2. Привіт, DataMapper!
  3. Співаємо з Sinatra!

Прийшов час поговорити про REST архітектуру додатку та її реалізацію на Sinatra.
Особисто мені коштувало багато зусиль зрозуміти, що таке REST. Тому прошу не чіплятися до того, наскільки я спрощую термінологію, щоб сфокусуватися на самій темі.
REST - це Representational State Transfer, так звана "передача стану представлення". Фактично - це спосіб організації доступу до ресурсів. Відповідно до цієї архітектури використовується чотири типи HTTP запитів - GET, POST, PUT і DELETE.
  • GET - отримати ресурс тільки для читання
  • POST - створити новий ресурс
  • PUT - оновити існуючий ресурс
  • DELETE - видалити ресурс

Нічого не нагадує? Якщо порівняти з SQL-синтаксисом, GET - це запит SELECT, POST - це INSERT, PUT - UPDATE, і DELETE - знову просто DELETE.
Ресурси - це ті дані, з якими ми працюємо. Наприклад у нашому блозі стаття - це ресурс, коментарій - це теж ресурс. Ресурси можуть мати взаємозв'язки, та містити в собі інші ресурси. Для більшості ресурсів в нашому додатку будуть необхідні операції їх створення, отримання, оновлення та видалення.

Крім звичних GET і POST Sinatra розуміє методи PUT і DELETE. Нажаль ці методи не підтримуються броузерами, але Sinatra вміє з ними працювати через прихований елемент форми з ім'ям "_method" і значенням, рівним методу HTTP: put або delete. Наприклад:
<form method="post" action "/destroy">
  <input type="hidden" name="_method" value="delete">
  <button type="submit">Destroy it</button>
</form>

Далі ми будемо вважати клас-контролер реалізацією інтерфейсу REST.
Наш контролер буде реалізовувати наступні сім дій(методів).
Чотири цих:
  • show: обробляє GET запит для відображення індивідуального ресурсу, який ідентифікується виразом params[:id]
  • create: обробляє POST запит для створення нового екземпляру ресурсу
  • update: обробляє PUT запит для оновлення існуючого ресурсу, ідентифікованого виразом params[:id], використовуючи дані зв'язані з запитом
  • destroy: обробляє DELETE запит для видалення екземпляра ресурсу, ідентифікованого виразом params[:id]

І три цих:
  • index: обробляє GET запит для відображення колекції ресурсів
  • new: обробляє GET запит, який створює логічну структуру нового ресурсу і передає її клієнту. Цей ресурс не буде збережений на сервері. Можна вважати, що дія new створює порожню форму, яка передається клієнту для заповнення.
  • edit: обробляє GET запит, який повертає вміст ресурсу, ідентифікованого виразом params[:id], в форму, пристосовану для редагування цього вмісту

Не важко помітити, що ці сім дій включають чотири базових операції для створення, читання, оновлення і видалення ресурсу - CRUD (create, read, update, delete). Серед них також є дії для виводу переліку ресурсів та дві додаткові дії, які повертають клієнту новий та існуючий ресурси в форму, призначену для редагування.

Для Sinatra назви цих дій не мають ніякого значення, і використовуються мною тільки для зручності, і є запозиченими з Rails.
Для того щоб реалізувати REST підхід у нашому додатку треба поступити інакше ніж у попередній статті. В першу чергу один і той же URL може в залежності залежати від типу HTTP запиту відповідати різним методам. Наприклад URL
/posts/1
повинен викликати метод show(для відображення статті №1), якщо був використаний запит GET, але у випадку запиту DELETE повинен викликати метод destroy.


Все що нам залишилося зробити, це реалізувати цих сім методів у нашому контролері і оновити шаблони представлень.

понеділок, 23 листопада 2009 р.

Співаємо з Sinatra!


Ця стаття є так би мовити третьою. У двох попередніх ми вже встигли познайомитися з веб-фреймворком Sinatra (Привіт Sinatra!) та ORM бібліотекою DataMapper (Привіт DataMapper!). Прийшов час застосувати ці знання на практиці. Напишемо наш "proof of concept" додаток, використовуючи Sinatra, DataMapper, HAML, SASS. Я вирішив, що ми проведемо наші навчальні заняття за написанням блогу.

Sinatra не піклується про те, як ви організовуєте ваш додаток. На відміну від Rails, Sinatra не накладає ряд серйозних обмежень на структуру ваших додатків. Ви можете покласти все в один файл, або розбити на структуру каталогів. Звичайно, якщо ви розіб'єте на окремі файли, потрібно підключати їх в міру необхідності - у Sinatra немає узгоджень, як в Rails, про те де шукати ці файли.
Моя структура каталогів, вона дуже проста:
/
  blog.rb
  db/
    db.sqlite3
  views/
    layout.haml
    /posts
      edit.haml
      index.haml
      new.haml
      show.haml

Я поклав все крім шаблонів в один файл. Таким чином конфігурації, моделі і всі події будуть у файлі blog.rb. Також Sinatra по замовчуванню підхоплює каталог views, який містить шаблони представлень.

понеділок, 9 листопада 2009 р.

Привіт, DataMapper!

DataMapper - це ORM бібліотека (англ. Object-relational mapping, Обє'ктно-реляційна проекція - технологія, яка зв'язую бази даних з концепцією об'єктно-орієнтовного програмування, створюючи "віртуальну об'єктну базу даних"). DataMapper написана на Ruby, і широко використовується у таких фреймворках як Merb та Sinatra. Вона була розроблена, щоб усунути недоліки бібліотеки ActiveRecord, яка використовується в Ruby on Rails по замовчуванню. DataMapper слідує стандартам ORM-моделі: таблиці відображаються у вигляді класів, записи - у вигляді об'єктів, а стовпці - у вигляді властивостей цих об'єктів. Методи класу використовуються для здійснення операцій на рівні таблиці, а методи екземпляра здійснюють операції над окремими рядками.
Якщо в базі даних є таблиця з назвою posts (записи), то наш застосунок матиме клас Post. Рядки цієї таблиці відповідають об'єктам класу - конкретний запис представляється як об'єкт класу Post. У межах цього об'єкту для отримання доступу до окремих стовпців і встановлення їм значення, використовуються властивості.

Інсталяція DataMapper

DataMapper доступний через менеджер пакетів Ruby Gem:
gem install dm-core

Якщо ви плануєте використовувати DataMapper з базою даних, встановіть адаптер бази даних з проекту DataObjects. В залежності від ваших уподобань, це може бути do_mysql, do_postgres або do_sqlite3.
gem install do_sqlite3

середа, 28 жовтня 2009 р.

Привіт, Sinatra!

Sinatra — об'єктно-орієнтований програмний каркас(framework) для створення веб-застосунків, написана на мові програмування Ruby. На офійному сайті написано, що Sinatra це навіть не фреймворк, а DSL для створення веб-додатків. Залежить від інтерфейсу веб-сервера Rack. Вона є альтернативою іншим Ruby фреймворкам, таким як Ruby on Rails, Merb, Nitro та Camping.
Sinatra є відкритим програмним забезпеченням і розповсюджується під ліцензією MIT.
Розроблена та створена Blake Mizerany, Sinatra є крихітною(близько 1500 рядків коду, що майже 1/100-а розміру Rails) та надзвичайно гнучкою. Вона не слідує типовій архітектурі Модель-Вид-Контролер(Model-View-Controller, MVC), яка використовується в інших фреймвоках, таких як Ruby On Rails. Натомість, Sinatra зосереджена на "швидкому створенню веб-додатків на Ruby із мінімальними зусиллями". Sinatra використовує всі можливості Ruby і є його оригінальним розширенням.

Sinatra дає незвичайне відчуття присутності. Це як музика. Ви диригент оркестру. І перша скрипка звучить так, як ви їх наказали, хоча ви не обов'язково повинні знати, як на ній грати. Але в той же час у вас є можливість посмикати струни, побити в барабани, засурмити фанфари. Sinatra крихітна, гнучка і модульна. Ви вільні у виборі, що використовувати у якості бібліотеки моделі, двигуна шаблонів, двигуна JavaScript. Незважаючи на свій юний вік Sinatra є потужним і багатообіцяючим інструментом, про що свідчить підтримка з боку таких таких маститих проектів, як Engine Yard, Heroku, GitHub і Songbird.

Інсталяція Sinatra
Розпочнемо знайомство із встановлення Sinatra.
У вас уже повинен бути встановлений Ruby. Для тих хто вже користується новою гілкою 1.9 можу вас втішити - починаючи з версії 0.9.2, Sinatra повністю сумісна з Ruby 1.9 і Rack 1.0. Найпростіший шлях - встановити Sinatra через Rubygems:
$ gem install sinatra


Привіт, Sinatra
Тепер давайте створимо наш перший веб-додаток.
# myapp.rb
require 'rubygems'
require 'sinatra'

get '/' do
"Привіт, Sinatra!"
end


понеділок, 22 червня 2009 р.

Merb tutorial in Ukrainian


На сайті молодої україномовної соціальної IT спільноти Розробка.com з'явився туторіал по Merb. Підручник охоплює як створювати прості програми за допомогою Merb, haml і DataMapper.