SlideShare a Scribd company logo
1 of 59
TEQUILA
Язык для продвинутой генерации JSON



               Иван Немытченко
           г. Омск, компания JazzCloud
JSON


{
 “id” : 205633,
 “name” : “jQuery in Action”,
 “authors” : [“Yehuda Katz”, “Bear Bibeault”]
}
Когда нужен JSON?
Когда нужен JSON?


• Rich client
Когда нужен JSON?


• Rich client
• ExtJS, Flash, AIR
Когда нужен JSON?


• Rich client
• ExtJS, Flash, AIR
• External API
Как обычно отдается JSON?
to_json



render :json => @products.to_json(...)
to_json
@products.to_json(
  :methods =>
[:label, :confirmed?, :formatted_description, :comment_text,
:tag_list, ...],
  :include => {
    :comments => {
      :only => [:comment, :id, :commenter_id],
      :methods => [:commenter_name, :date]
    },
    :taggings => {
      :methods => [:date],
      :include => {
        :tag => {
          :only => [:name, :background, :foreground]
        },
        :tagger => {
          :only => [:login]
        }}}})
as_json



render :json => @products
переопределение as_json в модели
class Product
     def as_json(options)
        super(
          :methods => [:label, :confirmed?,
            :formatted_description, :comment_text, :tag_list, ...],
          :include => {
            :comments => {
              :only => [:comment, :id, :commenter_id],
              :methods => [:commenter_name, :date]},
            :taggings => {
              :methods => [:date],
              :include => {
                :tag => { :only =>[:name, :background, :foreground]},
                :tagger => { :only => [:login] }}}}
            )
    end
end
переопределение as_json в моделях
class Product < AR::Base                                    class Tagging
  def label; end                                              def as_json # ...
  def confirmed?; end                                       end
  #...
  def as_json                                               class Tag
    super(                                                   def as_json # ...
      :methods => [:label, :confirmed?,                     end
                   :formatted_description, :comment_text,
                   :tag_list, ...],                         class User
      :include => { :comments, :taggings }                   def as_json # ...
    )                                                       end
  end
end

class Comment < AR::Base
  def as_json
    super(
      :only => [:comment, :id, :commenter_id],
      :methods => [:commenter_name, :date]
    )
  end
end
Гладкий и шелковистый контроллер



class ProductsController < ApplicationController
  def index
    render :json => @products
  end
end
А что, если ...
нужно более чем одно представление модели



    class ProductsController < ApplicationController
      def index
        render :json => @products.as_json(...)
      end
    end
хочется передать параметр в метод
render :json => @product.to_json(
                  :methods => :favorited_by_user?(current_user)
                )
хочется передать параметр в метод
render :json => @product.to_json(
             я
   Так нельз      :methods => :favorited_by_user?(current_user)
                )
хочется передать параметр в метод
render :json => @product.to_json(
             я
   Так нельз      :methods => :favorited_by_user?(current_user)
                )

class Product < AR::Base
  attr_accessor :current_user

  def favorited_by_user?(user=nil)
    user ||= current_user
    # ...                    Если си
                                     ль
  end                       то можн но хочется,
end                                 о конеч
                                            но
@product.current_user = current_user
render :json => @product.to_json(:methods => :favorited_by_user?)
Неприятности:
• Каша из :include и :methods в сложных случаях
Неприятности:
• Каша из :include и :methods в сложных случаях
• Структура базы меняется → Меняется JSON
Неприятности:
• Каша из :include и :methods в сложных случаях
• Структура базы меняется → Меняется JSON
• Модель засоряется мелкими методами, только
  чтобы “причесать” JSON output
Неприятности:
• Каша из :include и :methods в сложных случаях
• Структура базы меняется → Меняется JSON
• Модель засоряется мелкими методами, только
  чтобы “причесать” JSON output
• Нельзя вызвать метод с параметрами
Неприятности:
• Каша из :include и :methods в сложных случаях
• Структура базы меняется → Меняется JSON
• Модель засоряется мелкими методами, только
  чтобы “причесать” JSON output
• Нельзя вызвать метод с параметрами
• Модель может иметь одно представление в
  JSON при использовании as_json
Неприятности:
• Каша из :include и :methods в сложных случаях
• Структура базы меняется → Меняется JSON
• Модель засоряется мелкими методами, только
  чтобы “причесать” JSON output
• Нельзя вызвать метод с параметрами
• Модель может иметь одно представление в
  JSON при использовании as_json
• Некоторые модели вынесены в плагины
Tequila
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
• Очистить модели от методов-хелперов
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
• Очистить модели от методов-хелперов
• Вызов методов с параметрами
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
• Очистить модели от методов-хелперов
• Вызов методов с параметрами
• Получить больший контроль над
  представлением данных
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
• Очистить модели от методов-хелперов
• Вызов методов с параметрами
• Получить больший контроль над
  представлением данных
• Чтобы красиво!
Задачи:
• Вынести логику представления в отдельный
  слой (presenter)
• Очистить модели от методов-хелперов
• Вызов методов с параметрами
• Получить больший контроль над
  представлением данных
• Чтобы красиво!
• Успеть за 2 дня!!!
Отступы
   -@humans => people
  :only
    .name => login
  :code => enhanced_name
    name + "!!!"
  :code => hello_world
    "Hello world!"
  +pets
    :except
      .human_id
      .pet_type_id
    +toys
      :methods
        .railsize("$", price.to_s)
Associations

:include => { :association => {...}}
Associations

:include => { :association => {...}}



+association
Вызов методов

:methods => [:calculate]
Вызов методов

:methods => [:calculate]


:methods
  .calculate

 .favorited_by_user?(current_user)
Переименование нод



+favourites => faves
Переименование нод



:only
  .tag_id => id

:methods
  .calculate => calculated
Блоки кода



:code => number_of_guests
  pluralize(number_of_guests,‘guest’)
Блоки кода



:code => formatted_price
  “$#{price}”
Блоки кода



:code => last_comment
  comments.last.comment if comments.any?
Опциональный ключ
-users               [{
    :only                 "user": {
       .username              "username":   "heather"
                          }},{
                          "user": {
                              "username":   "george"
                          }},{
                          "user": {
                              "username":   "frank"
                          }},{
                          "user": {
                              "username":   "aaron"
                          }}]
Опциональный ключ
-users~             [{
    :only                "username":   "heather"},{
      .username          "username":   "george"},{
                         "username":   "frank"},{
                         "username":   "elizabeth"}
                    ]
Подклеивание ассоциаций
+tag               {'tag' :
  :only                    {'label' : 'Happy Christmas!',
                            'tagger' : {'name' : 'Mr Lawrence"}}
    .label
  +tagger
    :only
      .name
Подклеивание ассоциаций
+tag                  {'tag' :
  :only                       {'label' : 'Happy Christmas!',
                               'tagger' : {'name' : 'Mr Lawrence"}}
    .label
  +tagger
    :only
      .name


+tag                {'tag' :
  :only                    {'label' : 'Happy Christmas!',
                             'tagger_name' : 'Mr Lawrence"}}
    .label
  <tagger
    :only
      .name => tagger_name
Partials
     -users
       :only
         .name
       &shared/pets


render :partial => ‘shared/pets’
Комментарии

+tag
  :only
    .label
  //temporarily disabled
  //<tagger
  // :only
  //    .name => tagger_name
Познавательная страничка
Как использовать
      gem install tequila

      config.gem ‘tequila’

/app/views/users/index.json.jazz
tequila-demo.heroku.com
Планы по развитию

Синтаксис
ActiveRecord
Error handling
Syntax highlight support
Спасибо, вопросы!
  github.com/inem/tequila
  inem.github.com/tequila
      twitter.com/inem
      twitter.com/0ex0
        jazzcloud.net
http://www.flickr.com/photos/tequilaphotos/

More Related Content

What's hot

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...sqadays8
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.Ontico
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
JDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяJDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяSQALab
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perlmayperl
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf Conference
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Денис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, всеДенис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, всеYandex
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Pavel Novitsky
 
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest
 

What's hot (20)

Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Sphinx 2013
Sphinx 2013Sphinx 2013
Sphinx 2013
 
Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.Андрей Аксёнов, Sphinx Technologies Inc.
Андрей Аксёнов, Sphinx Technologies Inc.
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажетсяJDI: Автоматизировать проще, чем кажется
JDI: Автоматизировать проще, чем кажется
 
Написание DSL в Perl
Написание DSL в PerlНаписание DSL в Perl
Написание DSL в Perl
 
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
web_serivces
web_serivcesweb_serivces
web_serivces
 
Денис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, всеДенис Чистяков: DOM, jQuery и все, все, все
Денис Чистяков: DOM, jQuery и все, все, все
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
 

Viewers also liked

Опыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовОпыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовIvan Nemytchenko
 
Principles. Misunderstood. Applied
Principles. Misunderstood. AppliedPrinciples. Misunderstood. Applied
Principles. Misunderstood. AppliedIvan Nemytchenko
 
A Walk Through The Bible (2)
A Walk Through The Bible (2)A Walk Through The Bible (2)
A Walk Through The Bible (2)Charles Rey
 
Inforouterproducttour V7
Inforouterproducttour V7Inforouterproducttour V7
Inforouterproducttour V7Charles Rey
 
Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Ivan Nemytchenko
 
Different approaches to ruby web applications architecture
Different approaches to ruby web applications architectureDifferent approaches to ruby web applications architecture
Different approaches to ruby web applications architectureIvan Nemytchenko
 
Tourism and Hospitality Studies
Tourism and Hospitality StudiesTourism and Hospitality Studies
Tourism and Hospitality Studiestache
 
Ssl 2013.3.4 witness and service_the fruit of revival
Ssl 2013.3.4 witness and service_the fruit of revivalSsl 2013.3.4 witness and service_the fruit of revival
Ssl 2013.3.4 witness and service_the fruit of revivalCharles Rey
 
What I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersWhat I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersIvan Nemytchenko
 
A Walk Through The Bible (1)
A Walk Through The Bible (1)A Walk Through The Bible (1)
A Walk Through The Bible (1)Charles Rey
 
Tourism and Hospitality Studies
Tourism and Hospitality StudiesTourism and Hospitality Studies
Tourism and Hospitality Studiestache
 
Lean Poker in Lviv announce
Lean Poker in Lviv announceLean Poker in Lviv announce
Lean Poker in Lviv announceIvan Nemytchenko
 
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe Rui Barroca
 
How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. Ivan Nemytchenko
 

Viewers also liked (20)

Опыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистовОпыт организации удаленной стажировки для рубистов
Опыт организации удаленной стажировки для рубистов
 
Abc
AbcAbc
Abc
 
Principles. Misunderstood. Applied
Principles. Misunderstood. AppliedPrinciples. Misunderstood. Applied
Principles. Misunderstood. Applied
 
A Walk Through The Bible (2)
A Walk Through The Bible (2)A Walk Through The Bible (2)
A Walk Through The Bible (2)
 
Inforouterproducttour V7
Inforouterproducttour V7Inforouterproducttour V7
Inforouterproducttour V7
 
2
22
2
 
Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?Рефакторинг rails-приложения. С чего начать?
Рефакторинг rails-приложения. С чего начать?
 
Different approaches to ruby web applications architecture
Different approaches to ruby web applications architectureDifferent approaches to ruby web applications architecture
Different approaches to ruby web applications architecture
 
Tourism and Hospitality Studies
Tourism and Hospitality StudiesTourism and Hospitality Studies
Tourism and Hospitality Studies
 
P1
P1P1
P1
 
Ssl 2013.3.4 witness and service_the fruit of revival
Ssl 2013.3.4 witness and service_the fruit of revivalSsl 2013.3.4 witness and service_the fruit of revival
Ssl 2013.3.4 witness and service_the fruit of revival
 
What I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developersWhat I Have Learned from Organizing Remote Internship for Ruby developers
What I Have Learned from Organizing Remote Internship for Ruby developers
 
Revelation 13
Revelation 13Revelation 13
Revelation 13
 
A Walk Through The Bible (1)
A Walk Through The Bible (1)A Walk Through The Bible (1)
A Walk Through The Bible (1)
 
ActiveRecord vs Mongoid
ActiveRecord vs MongoidActiveRecord vs Mongoid
ActiveRecord vs Mongoid
 
Tourism and Hospitality Studies
Tourism and Hospitality StudiesTourism and Hospitality Studies
Tourism and Hospitality Studies
 
Lean Poker in Lviv announce
Lean Poker in Lviv announceLean Poker in Lviv announce
Lean Poker in Lviv announce
 
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe
Why UX Matters? for Startup Braga 2015 #2 Acceleration Programe
 
How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages. How to use any static site generator with GitLab Pages.
How to use any static site generator with GitLab Pages.
 
Hexlet Deck
Hexlet DeckHexlet Deck
Hexlet Deck
 

Similar to Tequila - язык для продвинутой генерации JSON

Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkGeorgy Turevich
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановMoscowJS
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...SQALab
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIPavel Asanov
 
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...«Автоматизация функционального тестирования REST API: секреты, тонкости и под...
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...2ГИС Технологии
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IERoman Komarov
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьphp-user-group-minsk
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...Ontico
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 

Similar to Tequila - язык для продвинутой генерации JSON (20)

Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
 
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид ШирмановКомпонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
Компонентная разработка на Stylus, Jade, Typescript - Леонид Ширманов
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
 
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...«Автоматизация функционального тестирования REST API: секреты, тонкости и под...
«Автоматизация функционального тестирования REST API: секреты, тонкости и под...
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQLCodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
CodeFest 2013. Аверин С. — MySQL+HandlerSocket=NoSQL
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 

More from Ivan Nemytchenko

Breaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIBreaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIIvan Nemytchenko
 
How to stop being Rails Developer
How to stop being Rails DeveloperHow to stop being Rails Developer
How to stop being Rails DeveloperIvan Nemytchenko
 
Breaking bad habits with GitLab CI
Breaking bad habits with GitLab CIBreaking bad habits with GitLab CI
Breaking bad habits with GitLab CIIvan Nemytchenko
 
From Rails-way to modular architecture
From Rails-way to modular architectureFrom Rails-way to modular architecture
From Rails-way to modular architectureIvan Nemytchenko
 
Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Ivan Nemytchenko
 
От Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреОт Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреIvan Nemytchenko
 
Coffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаCoffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаIvan Nemytchenko
 

More from Ivan Nemytchenko (7)

Breaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CIBreaking Bad Habits with GitLab CI
Breaking Bad Habits with GitLab CI
 
How to stop being Rails Developer
How to stop being Rails DeveloperHow to stop being Rails Developer
How to stop being Rails Developer
 
Breaking bad habits with GitLab CI
Breaking bad habits with GitLab CIBreaking bad habits with GitLab CI
Breaking bad habits with GitLab CI
 
From Rails-way to modular architecture
From Rails-way to modular architectureFrom Rails-way to modular architecture
From Rails-way to modular architecture
 
Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014Рассказ про RedDotRubyConf 2014
Рассказ про RedDotRubyConf 2014
 
От Rails-way к модульной архитектуре
От Rails-way к модульной архитектуреОт Rails-way к модульной архитектуре
От Rails-way к модульной архитектуре
 
Coffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчикаCoffescript - счастье для javascript-разработчика
Coffescript - счастье для javascript-разработчика
 

Tequila - язык для продвинутой генерации JSON

Editor's Notes

  1. - JavaScript Object Notation. - &amp;#x432; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x432;&amp;#x43E;&amp;#x434;&amp;#x435;: &amp;#x422;&amp;#x435;&amp;#x43A;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x44B;&amp;#x439; &amp;#x444;&amp;#x43E;&amp;#x440;&amp;#x43C;&amp;#x430;&amp;#x442; &amp;#x43E;&amp;#x431;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x430; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x43C;&amp;#x438;, &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x439; &amp;#x43D;&amp;#x430; &amp;#x441;&amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x441;&amp;#x438;&amp;#x441;&amp;#x435; JavaScript - &amp;#x421;&amp;#x444;&amp;#x435;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x43A;&amp;#x438;&amp;#x439; JSON &amp;#x432; &amp;#x432;&amp;#x430;&amp;#x43A;&amp;#x443;&amp;#x443;&amp;#x43C;&amp;#x435;.
  2. &amp;#x413;&amp;#x434;&amp;#x435; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x435;&amp;#x43D; JSON? &amp;#x414;&amp;#x43B;&amp;#x44F; &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x430;&amp;#x43B;&amp;#x430; &amp;#x434;&amp;#x430;&amp;#x432;&amp;#x430;&amp;#x439;&amp;#x442;&amp;#x435; &amp;#x440;&amp;#x430;&amp;#x441;&amp;#x441;&amp;#x43C;&amp;#x43E;&amp;#x442;&amp;#x440;&amp;#x438;&amp;#x43C; &amp;#x441;&amp;#x438;&amp;#x442;&amp;#x443;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x438;, &amp;#x43A;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x432;&amp;#x43E;&amp;#x437;&amp;#x43D;&amp;#x438;&amp;#x43A;&amp;#x430;&amp;#x435;&amp;#x442; &amp;#x43D;&amp;#x435;&amp;#x43E;&amp;#x431;&amp;#x445;&amp;#x43E;&amp;#x434;&amp;#x438;&amp;#x43C;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x44C; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x430;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x435; &amp;#x432; &amp;#x444;&amp;#x43E;&amp;#x440;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x435; JSON
  3. &amp;#x41A;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x443; &amp;#x43D;&amp;#x430;&amp;#x441; &amp;#x435;&amp;#x441;&amp;#x442;&amp;#x44C; &amp;#x444;&amp;#x440;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x43D;&amp;#x434; &amp;#x43D;&amp;#x430; &amp;#x43A;&amp;#x43B;&amp;#x438;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x439; &amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x43E;&amp;#x43D;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x440; &amp;#x441; &amp;#x434;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x43C;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x439; &amp;#x444;&amp;#x438;&amp;#x43B;&amp;#x44C;&amp;#x442;&amp;#x440;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x435;&amp;#x439;/&amp;#x441;&amp;#x43E;&amp;#x440;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x43E;&amp;#x432;&amp;#x43A;&amp;#x43E;&amp;#x439; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x445;. &amp;#x41F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x440;: http://ukijs.org/examples/core-examples/table/
  4. &amp;#x41A;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x43C;&amp;#x44B; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435;&amp;#x43C; backend &amp;#x434;&amp;#x43B;&amp;#x44F; ExtJS, Flash, AIR-&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x439;
  5. &amp;#x418;&amp;#x43B;&amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x432;&amp;#x44B;&amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x442;&amp;#x44C; API &amp;#x43D;&amp;#x430;&amp;#x448;&amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x443;&amp;#x436;&amp;#x443;
  6. &amp;#x41A;&amp;#x430;&amp;#x43A; &amp;#x43E;&amp;#x431;&amp;#x44B;&amp;#x447;&amp;#x43D;&amp;#x43E; &amp;#x43E;&amp;#x442;&amp;#x434;&amp;#x430;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; JSON &amp;#x438;&amp;#x437; &amp;#x440;&amp;#x435;&amp;#x43B;&amp;#x44C;&amp;#x441;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;?
  7. &amp;#x41C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x43F;&amp;#x43E; &amp;#x441;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x43D;&amp;#x43A;&amp;#x435;
  8. &amp;#x41F;&amp;#x43E;&amp;#x43B;&amp;#x443;&amp;#x447;&amp;#x430;&amp;#x435;&amp;#x43C; &amp;#x432;&amp;#x43E;&amp;#x442; &amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x443;&amp;#x44E; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x44F;&amp;#x434;&amp;#x43D;&amp;#x443;&amp;#x44E; &amp;#x43A;&amp;#x430;&amp;#x448;&amp;#x443; &amp;#x432; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x43B;&amp;#x435;&amp;#x440;&amp;#x435;
  9. &amp;#x412; Rails 2.3.3 &amp;#x440;&amp;#x435;&amp;#x448;&amp;#x438;&amp;#x43B;&amp;#x438; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;&amp;#x442;&amp;#x44C; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x43B;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x445; &amp;#x438; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x43E;&amp;#x441;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x435;&amp;#x43D;&amp;#x43D;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x432;&amp;#x435;&amp;#x440;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435;. as_json &amp;#x444;&amp;#x43E;&amp;#x440;&amp;#x43C;&amp;#x438;&amp;#x440;&amp;#x443;&amp;#x435;&amp;#x442; &amp;#x445;&amp;#x44D;&amp;#x448;, &amp;#x430; to_json &amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x442;&amp;#x443;&amp;#x43F;&amp;#x43E; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x433;&amp;#x43E;&amp;#x43D;&amp;#x44F;&amp;#x435;&amp;#x442; &amp;#x432; json
  10. &amp;#x412;&amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x448;&amp;#x438; &amp;#x201C;&amp;#x43D;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x43D;&amp;#x434;&amp;#x430;&amp;#x440;&amp;#x442;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x201D; &amp;#x442;&amp;#x435;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x44C; &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x438; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x432;&amp;#x44B;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x438;&amp;#x442;&amp;#x44C; &amp;#x432; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44C;
  11. &amp;#x410; &amp;#x432;&amp;#x435;&amp;#x440;&amp;#x43D;&amp;#x435;&amp;#x435; &amp;#x432; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;. &amp;#x412; &amp;#x43A;&amp;#x430;&amp;#x436;&amp;#x434;&amp;#x43E;&amp;#x439; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438; &amp;#x433;&amp;#x434;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435;, &amp;#x43E;&amp;#x442;&amp;#x43B;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x43E;&amp;#x435; &amp;#x43E;&amp;#x442; &amp;#x441;&amp;#x442;&amp;#x430;&amp;#x43D;&amp;#x434;&amp;#x430;&amp;#x440;&amp;#x442;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E;, &amp;#x43C;&amp;#x44B; &amp;#x43E;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44F;&amp;#x435;&amp;#x43C; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; as_json. &amp;#x41C;&amp;#x44B; &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43C; &amp;#x43D;&amp;#x435; &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x44B;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; super, &amp;#x430;
  12. &amp;#x41A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x43B;&amp;#x435;&amp;#x440;&amp;#x44B; &amp;#x442;&amp;#x435;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x44C; &amp;#x443; &amp;#x43D;&amp;#x430;&amp;#x441; &amp;#x433;&amp;#x43B;&amp;#x430;&amp;#x434;&amp;#x43A;&amp;#x438;&amp;#x435; &amp;#x438; &amp;#x448;&amp;#x435;&amp;#x43B;&amp;#x43A;&amp;#x43E;&amp;#x432;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x44B;&amp;#x435;. Fat model. Skinny controller. &amp;#x412;&amp;#x441;&amp;#x435; as_json &amp;#x442;&amp;#x435;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x44C; &amp;#x443; &amp;#x43D;&amp;#x430;&amp;#x441; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x43E; &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x44B;&amp;#x432;&amp;#x430;&amp;#x44E;&amp;#x442;&amp;#x441;&amp;#x44F; &amp;#x43F;&amp;#x43E; &amp;#x446;&amp;#x435;&amp;#x43F;&amp;#x43E;&amp;#x447;&amp;#x43A;&amp;#x435;. &amp;#x418;&amp;#x442;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x435;&amp;#x43C;: - &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;-&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x437;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x440; &amp;#x432; &amp;#x43A;&amp;#x430;&amp;#x436;&amp;#x434;&amp;#x43E;&amp;#x439; &amp;#x438;&amp;#x437; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x44B;&amp;#x445; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x435;&amp;#x439; - &amp;#x43D;&amp;#x435;&amp;#x43A;&amp;#x43E;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x43E;&amp;#x435; &amp;#x43A;&amp;#x43E;&amp;#x43B;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x43E; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x432;-&amp;#x445;&amp;#x435;&amp;#x43B;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x43E;&amp;#x432;, &amp;#x447;&amp;#x442;&amp;#x43E;&amp;#x431;&amp;#x44B; &amp;#x201C;&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x430;&amp;#x442;&amp;#x44C;&amp;#x201D; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x435; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x434; &amp;#x432;&amp;#x44B;&amp;#x434;&amp;#x430;&amp;#x447;&amp;#x435;&amp;#x439; &amp;#x43D;&amp;#x430; &amp;#x43A;&amp;#x43B;&amp;#x438;&amp;#x435;&amp;#x43D;&amp;#x442; &amp;#x42D;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x43E;, &amp;#x447;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x435;&amp;#x439;&amp;#x447;&amp;#x430;&amp;#x441; &amp;#x43D;&amp;#x430;&amp;#x437;&amp;#x44B;&amp;#x432;&amp;#x430;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; Rails way.
  13. &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x431;&amp;#x43E;&amp;#x43B;&amp;#x435;&amp;#x435; &amp;#x447;&amp;#x435;&amp;#x43C; &amp;#x43E;&amp;#x434;&amp;#x43D;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x43B;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438; &amp;#x432; json &amp;#x41D;&amp;#x430;&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x440;, &amp;#x434;&amp;#x43B;&amp;#x44F; &amp;#x441;&amp;#x442;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x446;&amp;#x44B; &amp;#x441;&amp;#x43E; &amp;#x441;&amp;#x43F;&amp;#x438;&amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x43C; &amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x437;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x435;&amp;#x439; &amp;#x43C;&amp;#x44B; &amp;#x445;&amp;#x43E;&amp;#x442;&amp;#x438;&amp;#x43C; &amp;#x432;&amp;#x44B;&amp;#x434;&amp;#x430;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x43C;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x438;&amp;#x43D;&amp;#x444;&amp;#x43E;&amp;#x440;&amp;#x43C;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x438; &amp;#x43E; &amp;#x44E;&amp;#x437;&amp;#x435;&amp;#x440;&amp;#x435;, &amp;#x430; &amp;#x432; &amp;#x441;&amp;#x43B;&amp;#x443;&amp;#x447;&amp;#x430;&amp;#x435;, &amp;#x43A;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x43C;&amp;#x44B; &amp;#x438;&amp;#x43D;&amp;#x43A;&amp;#x43B;&amp;#x44E;&amp;#x434;&amp;#x438;&amp;#x43C; &amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x437;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x44F; &amp;#x43A; &amp;#x43A;&amp;#x43E;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x44E;, &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x44B; &amp;#x442;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x43A;&amp;#x43E; &amp;#x435;&amp;#x433;&amp;#x43E; login &amp;#x438; id. &amp;#x422;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x435;&amp;#x43A;&amp;#x443;&amp;#x434;&amp;#x430; &amp;#x434;&amp;#x435;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C;&amp;#x441;&amp;#x44F;, &amp;#x438;, &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430;, &amp;#x432; &amp;#x43A;&amp;#x43E;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x44B;&amp;#x445; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x43E;&amp;#x442;&amp;#x43B;&amp;#x438;&amp;#x447;&amp;#x430;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; &amp;#x43E;&amp;#x442; &amp;#x434;&amp;#x435;&amp;#x444;&amp;#x43E;&amp;#x43B;&amp;#x442;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E;(&amp;#x437;&amp;#x430;&amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x43C;&amp;#x438;), &amp;#x43E;&amp;#x43F;&amp;#x44F;&amp;#x442;&amp;#x44C; &amp;#x43F;&amp;#x438;&amp;#x441;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x440;&amp;#x443;&amp;#x447;&amp;#x43A;&amp;#x430;&amp;#x43C;&amp;#x438; &amp;#x432; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x43B;&amp;#x435;&amp;#x440;&amp;#x435;
  14. &amp;#x422;&amp;#x430;&amp;#x43A; &amp;#x43D;&amp;#x435;&amp;#x43B;&amp;#x44C;&amp;#x437;&amp;#x44F; &amp;#x43A; &amp;#x441;&amp;#x43E;&amp;#x436;&amp;#x430;&amp;#x43B;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44E;
  15. &amp;#x41D;&amp;#x43E; &amp;#x435;&amp;#x441;&amp;#x43B;&amp;#x438; &amp;#x441;&amp;#x438;&amp;#x43B;&amp;#x44C;&amp;#x43D;&amp;#x43E; &amp;#x445;&amp;#x43E;&amp;#x447;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F;, &amp;#x442;&amp;#x43E; &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E;.
  16. &amp;#x418;&amp;#x442;&amp;#x43E;&amp;#x433;&amp;#x43E;, &amp;#x432;&amp;#x43E;&amp;#x442; &amp;#x43D;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x43A;&amp;#x438;&amp;#x435; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438; &amp;#x43C;&amp;#x44B; &amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x435;&amp;#x43C; &amp;#x448;&amp;#x430;&amp;#x43D;&amp;#x441;&amp;#x44B; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C;&amp;#x441;&amp;#x44F;.
  17. &amp;#x415;&amp;#x441;&amp;#x43B;&amp;#x438; &amp;#x438;&amp;#x441;&amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x437;&amp;#x443;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; &amp;#x448;&amp;#x442;&amp;#x430;&amp;#x442;&amp;#x43D;&amp;#x44B;&amp;#x439; to_json, &amp;#x43F;&amp;#x440;&amp;#x438; &amp;#x438;&amp;#x437;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x438; &amp;#x441;&amp;#x442;&amp;#x440;&amp;#x443;&amp;#x43A;&amp;#x442;&amp;#x443;&amp;#x440;&amp;#x44B; &amp;#x431;&amp;#x430;&amp;#x437;&amp;#x44B; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x445;, &amp;#x438;&amp;#x437;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x44F;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; &amp;#x441;&amp;#x442;&amp;#x440;&amp;#x443;&amp;#x43A;&amp;#x442;&amp;#x443;&amp;#x440;&amp;#x430; JSON-&amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x445;
  18. &amp;#x41D;&amp;#x435;&amp;#x442; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x441;&amp;#x43F;&amp;#x43E;&amp;#x441;&amp;#x43E;&amp;#x431;&amp;#x430; &amp;#x432;&amp;#x44B;&amp;#x437;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; &amp;#x441; &amp;#x43F;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x438;
  19. &amp;#x41F;&amp;#x440;&amp;#x438; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x43E;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x438; as_json &amp;#x432; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438; &amp;#x43C;&amp;#x44B; &amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x435;&amp;#x43C; &amp;#x442;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x43A;&amp;#x43E; &amp;#x43E;&amp;#x434;&amp;#x43D;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x43B;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x448;&amp;#x435;&amp;#x439; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;. &amp;#x410; &amp;#x438;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x434;&amp;#x430; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x431;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x448;&amp;#x435;
  20. &amp;#x415;&amp;#x441;&amp;#x43B;&amp;#x438; &amp;#x43D;&amp;#x435;&amp;#x43A;&amp;#x43E;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x44B;&amp;#x435; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438; &amp;#x432;&amp;#x44B;&amp;#x43D;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D;&amp;#x44B; &amp;#x432; &amp;#x43F;&amp;#x43B;&amp;#x430;&amp;#x433;&amp;#x438;&amp;#x43D;&amp;#x44B;, &amp;#x438;&amp;#x441;&amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x44C;&amp;#x437;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435; as_json &amp;#x43E;&amp;#x431;&amp;#x43E;&amp;#x440;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x432;&amp;#x430;&amp;#x435;&amp;#x442;&amp;#x441;&amp;#x44F; &amp;#x440;&amp;#x44F;&amp;#x434;&amp;#x43E;&amp;#x43C; &amp;#x43D;&amp;#x435;&amp;#x443;&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x441;&amp;#x442;&amp;#x432;.
  21. !! &amp;#x412;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x438;&amp;#x442;&amp;#x44C; &amp;#x43A;&amp;#x430;&amp;#x440;&amp;#x442;&amp;#x438;&amp;#x43D;&amp;#x43A;&amp;#x443;
  22. &amp;#x41A;&amp;#x430;&amp;#x43A;&amp;#x438;&amp;#x435; &amp;#x437;&amp;#x430;&amp;#x434;&amp;#x430;&amp;#x447;&amp;#x438; &amp;#x43C;&amp;#x44B; &amp;#x440;&amp;#x435;&amp;#x448;&amp;#x430;&amp;#x43B;&amp;#x438; &amp;#x441;&amp;#x43E;&amp;#x437;&amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435;&amp;#x43C; &amp;#x442;&amp;#x435;&amp;#x43A;&amp;#x438;&amp;#x43B;&amp;#x44B;.
  23. &amp;#x427;&amp;#x442;&amp;#x43E;&amp;#x431;&amp;#x44B; &amp;#x44D;&amp;#x442;&amp;#x43E; &amp;#x431;&amp;#x44B;&amp;#x43B;&amp;#x43E; &amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x441;&amp;#x438;&amp;#x432;&amp;#x43E; &amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x433;&amp;#x43B;&amp;#x44F;&amp;#x434;&amp;#x43D;&amp;#x43E;. &amp;#x41A;&amp;#x430;&amp;#x43A; &amp;#x432; HAML &amp;#x43D;&amp;#x430;&amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x440;.
  24. &amp;#x421;&amp;#x430;&amp;#x43C;&amp;#x43E;&amp;#x435; &amp;#x432;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43B;&amp;#x43E;&amp;#x435; &amp;#x432; &amp;#x442;&amp;#x43E;&amp;#x43C;, &amp;#x447;&amp;#x442;&amp;#x43E; &amp;#x43C;&amp;#x44B; &amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x430;&amp;#x43B;&amp;#x438; &amp;#x44D;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x435;&amp;#x43A;&amp;#x442; &amp;#x432; &amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x43A;&amp;#x430;&amp;#x445; RailsRumble. &amp;#x418; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x43D;&amp;#x430;&amp;#x434;&amp;#x43E; &amp;#x431;&amp;#x44B;&amp;#x43B;&amp;#x43E; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x442;&amp;#x44C; &amp;#x437;&amp;#x430;&amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x447;&amp;#x438;&amp;#x442;&amp;#x44C; &amp;#x435;&amp;#x433;&amp;#x43E; &amp;#x437;&amp;#x430; &amp;#x434;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x43D;&amp;#x44F;.
  25. 1. &amp;#x43A;&amp;#x43E;&amp;#x434; to json -&gt; tequila 2. &amp;#x43E;&amp;#x43F;&amp;#x442;&amp;#x438;&amp;#x43C;&amp;#x438;&amp;#x437;&amp;#x438;&amp;#x440;&amp;#x443;&amp;#x435;&amp;#x43C; 3. &amp;#x432;&amp;#x44B;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x438;&amp;#x43C; &amp;#x445;&amp;#x435;&amp;#x43B;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x44B; &amp;#x432; &amp;#x448;&amp;#x430;&amp;#x431;&amp;#x43B;&amp;#x43E;&amp;#x43D;
  26. &amp;#x424;&amp;#x438;&amp;#x447;&amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x434;&amp;#x43E; &amp;#x441;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x43F;&amp;#x43E; &amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x441;&amp;#x438;&amp;#x432;&amp;#x43E;&amp;#x43C;&amp;#x443; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x440;&amp;#x447;&amp;#x438;&amp;#x43A;&amp;#x443; &amp;#x43D;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x436;&amp;#x434;&amp;#x443;&amp;#x44E; &amp;#x444;&amp;#x438;&amp;#x447;&amp;#x443;.
  27. &amp;#x41E;&amp;#x442;&amp;#x441;&amp;#x442;&amp;#x443;&amp;#x43F;&amp;#x43E;-&amp;#x43E;&amp;#x440;&amp;#x438;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x43E;&amp;#x435; &amp;#x444;&amp;#x43E;&amp;#x440;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x41A;&amp;#x430;&amp;#x43A; &amp;#x432; python, HAML, SASS
  28. &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x43D;&amp;#x430;&amp;#x437;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x430;&amp;#x441;&amp;#x441;&amp;#x43E;&amp;#x446;&amp;#x438;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x438;
  29. &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x438;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x44C; &amp;#x430;&amp;#x442;&amp;#x440;&amp;#x438;&amp;#x431;&amp;#x443;&amp;#x442;&amp;#x44B; &amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x44B;
  30. &amp;#x41F;&amp;#x43E;&amp;#x434;&amp;#x43A;&amp;#x43B;&amp;#x435;&amp;#x438;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435; has_one &amp;#x430;&amp;#x441;&amp;#x441;&amp;#x43E;&amp;#x446;&amp;#x438;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x439;
  31. &amp;#x41F;&amp;#x43E;&amp;#x434;&amp;#x43A;&amp;#x43B;&amp;#x435;&amp;#x438;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x435; has_one &amp;#x430;&amp;#x441;&amp;#x441;&amp;#x43E;&amp;#x446;&amp;#x438;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x439; &amp;#x42D;&amp;#x442;&amp;#x43E; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;&amp;#x435;&amp;#x442; &amp;#x43D;&amp;#x430; &amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x43B;&amp;#x44C; &amp;#x443;&amp;#x433;&amp;#x43E;&amp;#x434;&amp;#x43D;&amp;#x43E; &amp;#x432;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x435; &amp;#x430;&amp;#x441;&amp;#x441;&amp;#x43E;&amp;#x446;&amp;#x438;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x438;.
  32. &amp;#x410; &amp;#x442;&amp;#x435;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x44C; &amp;#x43F;&amp;#x43E;&amp;#x437;&amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x430;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x44C;&amp;#x43D;&amp;#x430;&amp;#x44F; &amp;#x441;&amp;#x442;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x438;&amp;#x447;&amp;#x43A;&amp;#x430; &amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x43C; &amp;#x43A;&amp;#x430;&amp;#x43A; &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x44D;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x438;&amp;#x441;&amp;#x445;&amp;#x43E;&amp;#x434;&amp;#x438;&amp;#x442;
  33. &amp;#x41C;&amp;#x44B; &amp;#x431;&amp;#x435;&amp;#x440;&amp;#x435;&amp;#x43C; &amp;#x43D;&amp;#x430;&amp;#x448;&amp;#x438; &amp;#x43A;&amp;#x443;&amp;#x447;&amp;#x435;&amp;#x440;&amp;#x44F;&amp;#x432;&amp;#x44B;&amp;#x435; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x44B;&amp;#x435;
  34. &amp;#x41F;&amp;#x440;&amp;#x438;&amp;#x432;&amp;#x43E;&amp;#x434;&amp;#x438;&amp;#x43C; &amp;#x438;&amp;#x445; &amp;#x432; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x44B;&amp;#x439; &amp;#x43D;&amp;#x443;&amp;#x436;&amp;#x43D;&amp;#x44B;&amp;#x439; &amp;#x43D;&amp;#x430;&amp;#x43C; &amp;#x432;&amp;#x438;&amp;#x434;
  35. &amp;#x414;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x434;&amp;#x438;&amp;#x43C; &amp;#x434;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x434;&amp;#x438;&amp;#x446;&amp;#x438;&amp;#x438;
  36. &amp;#x414;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x434;&amp;#x438;&amp;#x43C; &amp;#x434;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x434;&amp;#x438;&amp;#x446;&amp;#x438;&amp;#x438;
  37. Treetop!