SlideShare uma empresa Scribd logo
1 de 86
Защо Ruby и Rails ?




Радослав Станков
Ruby on Rails семинар – Варненски свободен университет 2010
Кой съм аз?

@rstankov




http://rstankov.com
http://blog.rstankov.com
http://github.com/rstankov
Ruby

Ruby е интерактивен,
обектно-ориентиран език за
програмиране.
Неготово мото е:
“Optimized for programmer happiness”
Ruby on Rails

   Ruby on Rails е framework
   за уеб приложения.
   Неготово мото е:
   “Web development doesn’t hurt”
Ruby

 Създаден от японеца Юкихиро
 Мацумото „Мац“.
 Първата публична версия излиза
 през 1995.
 Версия 2.0 се очакава да излезе за
 Коледа / не се казва коя /
private $_products = null;
public function getProducts($categoryId){
  if ($this->_products === null){
    $this->_products = Product::where(array(
      'category_id' => $categoryId
    ));
  }
  return $this->products;
}
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where({ :category_id => category_id })
end
def products(category_id)
  @products ||= Product.where( :category_id => category_id )
end
def products(category_id)
  @products ||= Product.where :category_id => category_id
end
5.times { puts "Ruby is cool!" }

5.times do
  puts "Ruby is cool!"
end
File.open("some_file.txt") do |file|
  file << "content"
end
[1,2,3,4].each { |value| puts value }

# => [1, 2, 3, 4]

[1,2,3,4].map { |value| value * value }

# => [1, 4, 9, 16]

[1,2,3,4].reduce { |a, b| a + b }

# => 10
def operate(value)
  yield value
end

value = operate(5) { |v| v + 4 }
puts value # 9
class Person
  attr_accessor :fist_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    "#{first_name} + #{last_name}"
  end
end

me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
class Person
  attr_accessor :fist_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    first_name + " " + last_name
  end
end

me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
class Person
  attr_accessor :fist_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    first_name + " " + last_name
  end
end

me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
class Person
  attr_accessor :fist_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    first_name + " " + last_name
  end
end

me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
class Person
  attr_accessor :fist_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    first_name + " " + last_name
  end
end

me = Person.new("Radoslav", "Stankov")
puts me.full_name # Radoslav Stankov
class Person
  def +(other_person)
    # ...
  end
end

person1 + person2
class Array
  def first
    self[0]
  end

  def second
    self[1]
  end
end

array = [1, 2, 3, 4]
array.first   # 1
array.second # 2
class Numeric
  def plus(x)
    self + x
  end
end

y = 5.plus(6)
Time.now - 2.days == 2.days.ago

1.month.ago + 45.days - 1.year
Ruby
•   димично определяне на типа данните
•   модули
•   отворени класове
•   блокове
•   анонимни функции
•   всяка операция връща резултат
•   всичко е изпълним код
•   изчистен синтаксис
•   мета програмиране
•   промяна на обектите по време на изпълнение
•   вградени регулярни изрази
Ruby on Rails
          Разработен от David
     Heinemeier Hansson от 37
     Signals.
     Първата публична версия е
     излиза през юли 2004.
     Текущата стабилна версия
     е 3.0.3
37signals




  Милиони клиенти ... по-малко от 37 служителя
MVC Архитектура
Начин на работа
Model
class Task < ActiveRecord::Base
  belongs_to :user

  has_many :comments

  validates_presence_of :user, :text
  validates_inclusion_of :status, :in => ["opened", "completed"]

  attr_readonly :user_id

  def editable?
    status == "opened"
  end
end
Model
class Task < ActiveRecord::Base
  belongs_to :user

  has_many :comments

  validates_presence_of :user, :text
  validates_inclusion_of :status, :in => ["opened", "completed"]

  attr_readonly :user_id

  def editable?
    status == "opened"
  end
end
Model
class Task < ActiveRecord::Base
  belongs_to :user

  has_many :comments

  validates_presence_of :user, :text
  validates_inclusion_of :status, :in => ["opened", "completed"]

  attr_readonly :user_id

  def editable?
    status == "opened"
  end
end
Model
class Task < ActiveRecord::Base
  belongs_to :user

  has_many :comments

  validates_presence_of :user, :text
  validates_inclusion_of :status, :in => ["opened", "completed"]

  attr_readonly :user_id

  def editable?
    status == "opened"
  end
end
Model
class Task < ActiveRecord::Base
  belongs_to :user

  has_many :comments

  validates_presence_of :user, :text
  validates_inclusion_of :status, :in => ["opened", "completed"]

  attr_readonly :user_id

  def editable?
    status == "opened"
  end
end
Controller
class TasksController < ApplicationController
  def index
    @tasks = Tasks.where(:status => "opened")
  end

  def show
    @task = Task.find(params[:id])
  end

  def create
    @task = current_user.tasks.build(params[:task])

    if @task.save
      redirect_to tasks_path
    else
      render :partial => "new"
    end
  end
end
Controller
class TasksController < ApplicationController
  def index
    @tasks = Tasks.where(:status => "opened")
  end

  def show
    @task = Task.find(params[:id])
  end

  def create
    @task = current_user.tasks.build(params[:task])

    if @task.save
      redirect_to tasks_path
    else
      render :partial => "new"
    end
  end
end
Controller
class TasksController < ApplicationController
  def index
    @tasks = Tasks.where(:status => "opened")
  end

  def show
    @task = Task.find(params[:id])
  end

  def create
    @task = current_user.tasks.build(params[:task])

    if @task.save
      redirect_to tasks_path
    else
      render :partial => "new"
    end
  end
end
Controller
class TasksController < ApplicationController
  def index
    @tasks = Tasks.where(:status => "opened")
  end

  def show
    @task = Task.find(params[:id])
  end

  def create
    @task = current_user.tasks.build(params[:task])

    if @task.save
      redirect_to tasks_path
    else
      render :partial => "new"
    end
  end
end
View
<%= form_for task do |form| %>
  <%= render 'shared/error_messages', :target => form.object %>
  <p>
    <%= form.label :text %>
    <%= form.text_area :text %>
  </p>
  <p>
    <%= form.label :status %>
    <%= form.select :status, Task.statuses %>
  </p>
  <div class="buttons">
    <%= form.submit %> |
    <% link_to "Cancel", task_path %>
  </div>
<% end %>
Test Driven Development
Test Driven Development
1   Добавя се тест
    ... за несъществуващ код
Test Driven Development
1   Добавя се тест
    ... за несъществуващ код




                               2   Пише се код
                                   ... колкото само тестът да мине
Test Driven Development
    1     Добавя се тест
          ... за несъществуващ код




                                          2   Пише се код
                                              ... колкото само тестът да мине




3       Правят се подобрения
        ... подобрява се качеството на кода
Test Driven Development
    1     Добавя се тест
          ... за несъществуващ код




                                          2   Пише се код
                                              ... колкото само тестът да мине




3       Правят се подобрения
        ... подобрява се качеството на кода
describe Task do
  it { should belong_to(:user) }
  it { should have_many(:notes) }

 it { should validate_presence_of(:user) }
 it { should validate_presence_of(:text) }

 describe "#editable?" do
   it "returns true if task status is 'opened'" do
     Task.new(:status => "opened").should be_editable
   end

    it "returns false if task status is 'rejected'" do
      Task.new(:status => "rejected").should_not be_editable
    end

    it "returns false if task status is 'completed" do
      Task.new(:status => "completed").should_not be_editable
    end
  end
end
Тесване на Controller
describe TasksController do
  describe "GET 'show'" do
    before { Task.should_recive(:find).with("1").and_return task }
    before { get :show, :id => "1" }

    it { should assign_to(:task).with(task) }
    it { should render_temlate("show") }
  end
end
Тестване на View
describe "tasks/show.html.erb" do
  before do
    assign :task, mock_model(Task, {
       :id   => 1,
       :text => "task text"
    })

    render
  end

  it "renders task text" do
    rendered.should contain("task text")
  end

  it "renders link for editing task" do
    rendered.should have_selector('a[href="/tasks/1/edit"]')
  end
end
Благодаря за вниманието



@rstankov

Mais conteúdo relacionado

Mais procurados

Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Thomas Fuchs
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Jon Kruger
 

Mais procurados (20)

Symfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technologySymfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technology
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
jQuery from the very beginning
jQuery from the very beginningjQuery from the very beginning
jQuery from the very beginning
 
Node.js in action
Node.js in actionNode.js in action
Node.js in action
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
Dollar symbol
Dollar symbolDollar symbol
Dollar symbol
 
5 Tips for Better JavaScript
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
 
Testable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScriptTestable, Object-Oriented JavaScript
Testable, Object-Oriented JavaScript
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
06 jQuery #burningkeyboards
06 jQuery  #burningkeyboards06 jQuery  #burningkeyboards
06 jQuery #burningkeyboards
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
 
05 JavaScript #burningkeyboards
05 JavaScript #burningkeyboards05 JavaScript #burningkeyboards
05 JavaScript #burningkeyboards
 
¿Cómo de sexy puede hacer Backbone mi código?
¿Cómo de sexy puede hacer Backbone mi código?¿Cómo de sexy puede hacer Backbone mi código?
¿Cómo de sexy puede hacer Backbone mi código?
 

Semelhante a Why ruby

Metaprogramovanie #1
Metaprogramovanie #1Metaprogramovanie #1
Metaprogramovanie #1
Jano Suchal
 
Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 
Simple restfull app_s
Simple restfull app_sSimple restfull app_s
Simple restfull app_s
netwix
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 

Semelhante a Why ruby (20)

Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
 
Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子
 
Metaprogramovanie #1
Metaprogramovanie #1Metaprogramovanie #1
Metaprogramovanie #1
 
CoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairCoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love Affair
 
SOLID Ruby, SOLID Rails
SOLID Ruby, SOLID RailsSOLID Ruby, SOLID Rails
SOLID Ruby, SOLID Rails
 
Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
 
Postobjektové programovanie v Ruby
Postobjektové programovanie v RubyPostobjektové programovanie v Ruby
Postobjektové programovanie v Ruby
 
Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with RspecRuby on Rails testing with Rspec
Ruby on Rails testing with Rspec
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Rails2 Pr
Rails2 PrRails2 Pr
Rails2 Pr
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Cox
 
Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
More to RoC weibo
More to RoC weiboMore to RoC weibo
More to RoC weibo
 
Simple restfull app_s
Simple restfull app_sSimple restfull app_s
Simple restfull app_s
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 

Why ruby

  • 1. Защо Ruby и Rails ? Радослав Станков Ruby on Rails семинар – Варненски свободен университет 2010
  • 3.
  • 4.
  • 5.
  • 6. Ruby Ruby е интерактивен, обектно-ориентиран език за програмиране. Неготово мото е: “Optimized for programmer happiness”
  • 7. Ruby on Rails Ruby on Rails е framework за уеб приложения. Неготово мото е: “Web development doesn’t hurt”
  • 8. Ruby Създаден от японеца Юкихиро Мацумото „Мац“. Първата публична версия излиза през 1995. Версия 2.0 се очакава да излезе за Коледа / не се казва коя /
  • 9.
  • 10. private $_products = null; public function getProducts($categoryId){ if ($this->_products === null){ $this->_products = Product::where(array( 'category_id' => $categoryId )); } return $this->products; }
  • 11. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 12. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 13. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 14. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 15. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 16. def products(category_id) @products ||= Product.where({ :category_id => category_id }) end
  • 17. def products(category_id) @products ||= Product.where( :category_id => category_id ) end
  • 18. def products(category_id) @products ||= Product.where :category_id => category_id end
  • 19. 5.times { puts "Ruby is cool!" } 5.times do puts "Ruby is cool!" end
  • 20. File.open("some_file.txt") do |file| file << "content" end
  • 21. [1,2,3,4].each { |value| puts value } # => [1, 2, 3, 4] [1,2,3,4].map { |value| value * value } # => [1, 4, 9, 16] [1,2,3,4].reduce { |a, b| a + b } # => 10
  • 22. def operate(value) yield value end value = operate(5) { |v| v + 4 } puts value # 9
  • 23. class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name "#{first_name} + #{last_name}" end end me = Person.new("Radoslav", "Stankov") puts me.full_name # Radoslav Stankov
  • 24. class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name end end me = Person.new("Radoslav", "Stankov") puts me.full_name # Radoslav Stankov
  • 25. class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name end end me = Person.new("Radoslav", "Stankov") puts me.full_name # Radoslav Stankov
  • 26. class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name end end me = Person.new("Radoslav", "Stankov") puts me.full_name # Radoslav Stankov
  • 27. class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name end end me = Person.new("Radoslav", "Stankov") puts me.full_name # Radoslav Stankov
  • 28. class Person def +(other_person) # ... end end person1 + person2
  • 29. class Array def first self[0] end def second self[1] end end array = [1, 2, 3, 4] array.first # 1 array.second # 2
  • 30. class Numeric def plus(x) self + x end end y = 5.plus(6)
  • 31. Time.now - 2.days == 2.days.ago 1.month.ago + 45.days - 1.year
  • 32. Ruby • димично определяне на типа данните • модули • отворени класове • блокове • анонимни функции • всяка операция връща резултат • всичко е изпълним код • изчистен синтаксис • мета програмиране • промяна на обектите по време на изпълнение • вградени регулярни изрази
  • 33.
  • 34.
  • 35.
  • 36. Ruby on Rails Разработен от David Heinemeier Hansson от 37 Signals. Първата публична версия е излиза през юли 2004. Текущата стабилна версия е 3.0.3
  • 37.
  • 38.
  • 39.
  • 40. 37signals Милиони клиенти ... по-малко от 37 служителя
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67. Model class Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" end end
  • 68. Model class Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" end end
  • 69. Model class Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" end end
  • 70. Model class Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" end end
  • 71. Model class Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" end end
  • 72. Controller class TasksController < ApplicationController def index @tasks = Tasks.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end end end
  • 73. Controller class TasksController < ApplicationController def index @tasks = Tasks.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end end end
  • 74. Controller class TasksController < ApplicationController def index @tasks = Tasks.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end end end
  • 75. Controller class TasksController < ApplicationController def index @tasks = Tasks.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end end end
  • 76. View <%= form_for task do |form| %> <%= render 'shared/error_messages', :target => form.object %> <p> <%= form.label :text %> <%= form.text_area :text %> </p> <p> <%= form.label :status %> <%= form.select :status, Task.statuses %> </p> <div class="buttons"> <%= form.submit %> | <% link_to "Cancel", task_path %> </div> <% end %>
  • 78. Test Driven Development 1 Добавя се тест ... за несъществуващ код
  • 79. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине
  • 80. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине 3 Правят се подобрения ... подобрява се качеството на кода
  • 81. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине 3 Правят се подобрения ... подобрява се качеството на кода
  • 82. describe Task do it { should belong_to(:user) } it { should have_many(:notes) } it { should validate_presence_of(:user) } it { should validate_presence_of(:text) } describe "#editable?" do it "returns true if task status is 'opened'" do Task.new(:status => "opened").should be_editable end it "returns false if task status is 'rejected'" do Task.new(:status => "rejected").should_not be_editable end it "returns false if task status is 'completed" do Task.new(:status => "completed").should_not be_editable end end end
  • 83. Тесване на Controller describe TasksController do describe "GET 'show'" do before { Task.should_recive(:find).with("1").and_return task } before { get :show, :id => "1" } it { should assign_to(:task).with(task) } it { should render_temlate("show") } end end
  • 84. Тестване на View describe "tasks/show.html.erb" do before do assign :task, mock_model(Task, { :id => 1, :text => "task text" }) render end it "renders task text" do rendered.should contain("task text") end it "renders link for editing task" do rendered.should have_selector('a[href="/tasks/1/edit"]') end end
  • 85.

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. Ruby &amp;#x435; &amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x443;&amp;#x435;&amp;#x43C;, &amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x430;&amp;#x43A;&amp;#x442;&amp;#x438;&amp;#x432;&amp;#x435;&amp;#x43D;, &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x43D;&amp;#x43E;-&amp;#x43E;&amp;#x440;&amp;#x438;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430;&amp;#x43D; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x43A; &amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x438;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x435;. &amp;#x422;&amp;#x43E;&amp;#x439; &amp;#x43A;&amp;#x43E;&amp;#x43C;&amp;#x431;&amp;#x438;&amp;#x43D;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x447;&amp;#x435;&amp;#x440;&amp;#x442;&amp;#x438; &amp;#x43E;&amp;#x442; &amp;#x43C;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x446;&amp;#x438;, &amp;#x441;&amp;#x440;&amp;#x435;&amp;#x434; &amp;#x43A;&amp;#x43E;&amp;#x438;&amp;#x442;&amp;#x43E; Smalltalk, Perl, Lisp &amp;#x438; Python.\n\n
  7. &amp;#x422;&amp;#x43E;&amp;#x439; &amp;#x435; framework &amp;#x437;&amp;#x430; &amp;#x443;&amp;#x435;&amp;#x431; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;. &amp;#x427;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x446;&amp;#x435;&amp;#x43B; &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x443;&amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x43D;&amp;#x438; &amp;#x438; &amp;#x443;&amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x440;&amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x435; &amp;#x43D;&amp;#x430; &amp;#x443;&amp;#x435;&amp;#x431; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;.\n\n
  8. &amp;#x422;&amp;#x43E;&amp;#x439; &amp;#x435; &amp;#x441;&amp;#x44A;&amp;#x437;&amp;#x434;&amp;#x430;&amp;#x434;&amp;#x435;&amp;#x43D; &amp;#x43E;&amp;#x442; &amp;#x44F;&amp;#x43F;&amp;#x43E;&amp;#x43D;&amp;#x435;&amp;#x446;&amp;#x430; &amp;#x42E;&amp;#x43A;&amp;#x438;&amp;#x445;&amp;#x438;&amp;#x440;&amp;#x43E; &amp;#x41C;&amp;#x430;&amp;#x446;&amp;#x443;&amp;#x43C;&amp;#x43E;&amp;#x442;&amp;#x43E; &amp;#x201E;&amp;#x41C;&amp;#x430;&amp;#x446;&amp;#x201C;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x437; 1995 &amp;#x438;&amp;#x437;&amp;#x43B;&amp;#x438;&amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x432;&amp;#x435;&amp;#x440;&amp;#x441;&amp;#x438;&amp;#x44F; &amp;#x43D;&amp;#x430; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x43A;&amp;#x430;. &amp;#xA0;&amp;#x41C;&amp;#x43E;&amp;#x442;&amp;#x43E;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x430; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x43A;&amp;#x430; &amp;#x435; &amp;#xA0;&amp;#x201E;&amp;#x41E;&amp;#x43F;&amp;#x442;&amp;#x438;&amp;#x43C;&amp;#x438;&amp;#x437;&amp;#x438;&amp;#x440;&amp;#x430;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x449;&amp;#x430;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x201D;\n\n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. &amp;#x421;&amp;#x442;&amp;#x440;&amp;#x435;&amp;#x43C;&amp;#x435;&amp;#x436;&amp;#x44A;&amp;#x442; &amp;#x43D;&amp;#x430; Ruby &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x43B;&amp;#x435;&amp;#x434;&amp;#x432;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43D;&amp;#x446;&amp;#x438;&amp;#x43F;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x43C;&amp;#x430;&amp;#x43B;&amp;#x43A;&amp;#x430; &amp;#x438;&amp;#x437;&amp;#x43D;&amp;#x435;&amp;#x43D;&amp;#x430;&amp;#x434;&amp;#x430;. &amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43E;&amp;#x437;&amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x430;&amp;#x432;&amp;#x430;, &amp;#x447;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x430; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x43A;&amp;#x430; &amp;#x442;&amp;#x440;&amp;#x44F;&amp;#x431;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x430; &amp;#x435; &amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x443;&amp;#x438;&amp;#x442;&amp;#x438;&amp;#x432;&amp;#x43D;&amp;#x43E; &amp;#x438; &amp;#x442;&amp;#x43E;&amp;#x439; &amp;#x434;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x438; &amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x430;, &amp;#x43A;&amp;#x430;&amp;#x43A;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x442; &amp;#x431;&amp;#x438; &amp;#x43E;&amp;#x447;&amp;#x430;&amp;#x43A;&amp;#x432;&amp;#x430;&amp;#x43B;.\nRuby &amp;#x435; &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x43D;&amp;#x43E;-&amp;#x43E;&amp;#x440;&amp;#x438;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430;&amp;#x43D;: &amp;#x432;&amp;#x441;&amp;#x435;&amp;#x43A;&amp;#x438; &amp;#x442;&amp;#x438;&amp;#x43F; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x438; &amp;#x435; &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;, &amp;#x432;&amp;#x43A;&amp;#x43B;&amp;#x44E;&amp;#x447;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x43D;&amp;#x43E; &amp;#x43A;&amp;#x43B;&amp;#x430;&amp;#x441;&amp;#x43E;&amp;#x432;&amp;#x435;, &amp;#x447;&amp;#x438;&amp;#x441;&amp;#x43B;&amp;#x430;, &amp;#x431;&amp;#x443;&amp;#x43B;&amp;#x435;&amp;#x432;&amp;#x438; &amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x439;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;, &amp;#x43A;&amp;#x43E;&amp;#x438;&amp;#x442;&amp;#x43E; &amp;#x432; &amp;#x43C;&amp;#x43D;&amp;#x43E;&amp;#x433;&amp;#x43E; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x446;&amp;#x438; &amp;#x43E;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44F;&amp;#x442; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43C;&amp;#x438;&amp;#x442;&amp;#x438;&amp;#x432;&amp;#x438;, &amp;#x430; &amp;#x43D;&amp;#x435; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x440;&amp;#x435;&amp;#x430;&amp;#x43B;&amp;#x43D;&amp;#x438; &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x438;.\n\n&amp;#x41D;&amp;#x44F;&amp;#x43A;&amp;#x43E;&amp;#x438; &amp;#x43E;&amp;#x442; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x432;&amp;#x430;&amp;#x436;&amp;#x43D;&amp;#x438;&amp;#x442;&amp;#x435; &amp;#x445;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43A;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x43A;&amp;#x438; &amp;#x43D;&amp;#x430; &amp;#x435;&amp;#x437;&amp;#x438;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x430;: \n&amp;#x434;&amp;#x438;&amp;#x43C;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x43E; &amp;#x43E;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44F;&amp;#x43D;&amp;#x435; &amp;#x43D;&amp;#x430; &amp;#x442;&amp;#x438;&amp;#x43F;&amp;#x430; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x438;&amp;#x442;&amp;#x435;\n&amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x443;&amp;#x43B;&amp;#x438; - &amp;#x201C;&amp;#x432;&amp;#x44A;&amp;#x437;&amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E;&amp;#x441;&amp;#x442; &amp;#x435;&amp;#x434;&amp;#x438;&amp;#x43D; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x443;&amp;#x43B; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x432;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x436;&amp;#x434;&amp;#x430; &amp;#x432; &amp;#x43C;&amp;#x43D;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x43E; &amp;#x43A;&amp;#x43B;&amp;#x430;&amp;#x441;&amp;#x43E;&amp;#x432;&amp;#x435;, &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x433;&amp;#x430; &amp;#x43C;&amp;#x43D;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x435;&amp;#x43D;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x441;&amp;#x43B;&amp;#x435;&amp;#x434;&amp;#x44F;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x435;&amp;#x201D;\n&amp;#x43E;&amp;#x442;&amp;#x432;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438; &amp;#x43A;&amp;#x43B;&amp;#x430;&amp;#x441;&amp;#x43E;&amp;#x432;&amp;#x435; - &amp;#x201C;&amp;#x43A;&amp;#x44A;&amp;#x43C; &amp;#x432;&amp;#x441;&amp;#x435;&amp;#x43A;&amp;#x438; &amp;#x43A;&amp;#x43B;&amp;#x430;&amp;#x441; &amp;#x43C;&amp;#x43E;&amp;#x433;&amp;#x430;&amp;#x442; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x438; &amp;#x430;&amp;#x442;&amp;#x440;&amp;#x438;&amp;#x431;&amp;#x443;&amp;#x442;&amp;#x438; &amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x438; &amp;#x43F;&amp;#x43E; &amp;#x432;&amp;#x440;&amp;#x435;&amp;#x43C;&amp;#x435; &amp;#x43D;&amp;#x430; &amp;#x438;&amp;#x437;&amp;#x43F;&amp;#x44A;&amp;#x43B;&amp;#x43D;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; &amp;#x43D;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x430;&amp;#x201D;\n&amp;#x431;&amp;#x43B;&amp;#x43E;&amp;#x43A;&amp;#x43E;&amp;#x432;&amp;#x435;\n&amp;#x430;&amp;#x43D;&amp;#x43E;&amp;#x43D;&amp;#x438;&amp;#x43C;&amp;#x43D;&amp;#x438; &amp;#x444;&amp;#x443;&amp;#x43D;&amp;#x43A;&amp;#x446;&amp;#x438;&amp;#x438;\n&amp;#x432;&amp;#x441;&amp;#x44F;&amp;#x43A;&amp;#x430; &amp;#x43E;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x430;&amp;#x446;&amp;#x438;&amp;#x44F; &amp;#x432;&amp;#x440;&amp;#x44A;&amp;#x449;&amp;#x430; &amp;#x440;&amp;#x435;&amp;#x437;&amp;#x443;&amp;#x43B;&amp;#x442;&amp;#x430;&amp;#x442;\n&amp;#x432;&amp;#x441;&amp;#x438;&amp;#x447;&amp;#x43A;&amp;#x43E; &amp;#x435; &amp;#x438;&amp;#x437;&amp;#x43F;&amp;#x44A;&amp;#x43B;&amp;#x43D;&amp;#x438;&amp;#x43C; &amp;#x43A;&amp;#x43E;&amp;#x434; - &amp;#x201C;&amp;#x432;&amp;#x43A;&amp;#x43B;&amp;#x44E;&amp;#x447;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x43D;&amp;#x43E; &amp;#x438; &amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x43A;&amp;#x43B;&amp;#x430;&amp;#x441;&amp;#x43E;&amp;#x432;&amp;#x435;&amp;#x442;&amp;#x435; &amp;#x432; &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x435; &amp;#x438;&amp;#x43C;&amp;#x430; &amp;#x446;&amp;#x438;&amp;#x43A;&amp;#x43B;&amp;#x438;, &amp;#x443;&amp;#x441;&amp;#x43B;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x438; &amp;#x43E;&amp;#x43F;&amp;#x435;&amp;#x440;&amp;#x430;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x438; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;&amp;#x201D;\n&amp;#x438;&amp;#x437;&amp;#x447;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x441;&amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x441;&amp;#x438;&amp;#x441; - &amp;#x201C;&amp;#x43D;&amp;#x435; &amp;#x435; &amp;#x437;&amp;#x430;&amp;#x434;&amp;#x44A;&amp;#x43B;&amp;#x436;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x43D;&amp;#x43E;, &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x441;&amp;#x43A;&amp;#x43E;&amp;#x431;&amp;#x438;, &amp;#x442;&amp;#x43E;&amp;#x447;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x437;&amp;#x430;&amp;#x43F;&amp;#x435;&amp;#x442;&amp;#x430;&amp;#x44F; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;&amp;#x201D;\n&amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x433;&amp;#x440;&amp;#x430;&amp;#x43C;&amp;#x438;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x435;\n&amp;#xA0;\n\n
  33. \n
  34. \n
  35. &amp;#x420;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x43E;&amp;#x442; David Heinemeier Hansson &amp;#x43E;&amp;#x442; 37 Signals. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x435; Rails &amp;#x435; &amp;#x431;&amp;#x438;&amp;#x43B; &amp;#x438;&amp;#x437;&amp;#x432;&amp;#x43B;&amp;#x435;&amp;#x447;&amp;#x435;&amp;#x43D; &amp;#x43E;&amp;#x442; &amp;#x442;&amp;#x44F;&amp;#x445;&amp;#x43D;&amp;#x43E;&amp;#x442;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435; Basecamp. &amp;#x412; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;&amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43D;&amp;#x430; Rails &amp;#x441;&amp;#x430; &amp;#x443;&amp;#x447;&amp;#x430;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x43B;&amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x434; 1500 &amp;#x447;&amp;#x43E;&amp;#x432;&amp;#x435;&amp;#x43A;&amp;#x430; &amp;#x43A;&amp;#x44A;&amp;#x43C; &amp;#x43C;&amp;#x43E;&amp;#x43C;&amp;#x435;&amp;#x43D;&amp;#x442;&amp;#x430;.\n\n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. Rails &amp;#x438;&amp;#x437;&amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x437;&amp;#x432;&amp;#x430; Model-View-Controller &amp;#x430;&amp;#x440;&amp;#x445;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x443;&amp;#x440;&amp;#x430;. &amp;#x427;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x430; &amp;#x446;&amp;#x435;&amp;#x43B; &amp;#x435; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44F;&amp;#x43D;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x430; &amp;#x431;&amp;#x438;&amp;#x437;&amp;#x43D;&amp;#x435;&amp;#x441; &amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43E;&amp;#x442; &amp;#x43F;&amp;#x43E;&amp;#x442;&amp;#x440;&amp;#x435;&amp;#x431;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x441;&amp;#x43A;&amp;#x438;&amp;#x44F; &amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x444;&amp;#x435;&amp;#x439;&amp;#x441;. &amp;#x41F;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430; &amp;#x435; &amp;#x43F;&amp;#x43E;-&amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x435;, &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x434;&amp;#x440;&amp;#x44A;&amp;#x436;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x431;&amp;#x44A;&amp;#x434;&amp;#x435;&amp;#x449;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;.\nModel - &amp;#x201C;&amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x434;&amp;#x438;&amp;#x43D;&amp;#x44F;&amp;#x432;&amp;#x430; &amp;#x431;&amp;#x438;&amp;#x437;&amp;#x43D;&amp;#x435;&amp;#x441; &amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x438; &amp;#x438;&amp;#x43D;&amp;#x444;&amp;#x440;&amp;#x430;&amp;#x441;&amp;#x442;&amp;#x440;&amp;#x443;&amp;#x43A;&amp;#x442;&amp;#x443;&amp;#x440;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435;&amp;#x442;&amp;#x43E;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x438;&amp;#x437;&amp;#x43F;&amp;#x43E;&amp;#x43B;&amp;#x437;&amp;#x432;&amp;#x430;&amp;#x442; ActiveRecord &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x438;, &amp;#x447;&amp;#x440;&amp;#x435;&amp;#x437; &amp;#x43A;&amp;#x43E;&amp;#x438;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x432;&amp;#x437;&amp;#x430;&amp;#x438;&amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x439;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430; &amp;#x441; &amp;#x431;&amp;#x430;&amp;#x437;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43E;&amp;#x442; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x438;. &amp;#x412; Rails &amp;#xA0;&amp;#x43F;&amp;#x43E;&amp;#x447;&amp;#x442;&amp;#x438; &amp;#x43D;&amp;#x438;&amp;#x43A;&amp;#x43E;&amp;#x433;&amp;#x430; &amp;#x43D;&amp;#x435; &amp;#x441;&amp;#x435; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x438; &amp;#x434;&amp;#x438;&amp;#x440;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x43D;&amp;#x43E; &amp;#x441; &amp;#x431;&amp;#x430;&amp;#x437;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43E;&amp;#x442; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x438; &amp;#x438; &amp;#x441; sql &amp;#x43A;&amp;#x43E;&amp;#x434;, &amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x437; ActiveRecord &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x201D;\nView - &amp;#x201C;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x441;&amp;#x442;&amp;#x430;&amp;#x432;&amp;#x43B;&amp;#x44F;&amp;#x432;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x442;&amp;#x440;&amp;#x435;&amp;#x431;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x441;&amp;#x43A;&amp;#x438;&amp;#x44F; &amp;#x438;&amp;#x43D;&amp;#x442;&amp;#x435;&amp;#x440;&amp;#x444;&amp;#x435;&amp;#x439;&amp;#x441;. &amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E; &amp;#x435; HTML &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430;&amp;#x201D;.\nController - &amp;#x201C;&amp;#x441;&amp;#x432;&amp;#x44A;&amp;#x440;&amp;#x437;&amp;#x432;&amp;#x430; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;&amp;#x442;&amp;#x435; &amp;#x438; &amp;#x438;&amp;#x437;&amp;#x433;&amp;#x43B;&amp;#x435;&amp;#x434;&amp;#x438;&amp;#x442;&amp;#x435; &amp;#x438; &amp;#x432;&amp;#x440;&amp;#x44A;&amp;#x449;&amp;#x430; &amp;#x440;&amp;#x435;&amp;#x437;&amp;#x443;&amp;#x43B;&amp;#x442;&amp;#x430;&amp;#x442; &amp;#x43D;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x442;&amp;#x440;&amp;#x435;&amp;#x431;&amp;#x438;&amp;#x442;&amp;#x435;&amp;#x43B;&amp;#x44F;&amp;#x201D;.\n&amp;#xA0;\n\n
  45. &amp;#x41A;&amp;#x430;&amp;#x43A; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x438; &amp;#x435;&amp;#x434;&amp;#x43D;&amp;#x43E; Rails &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x43B;&amp;#x43E;&amp;#x436;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x435;? \n&amp;#x41F;&amp;#x440;&amp;#x438; &amp;#x43F;&amp;#x440;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x433;&amp;#x430;&amp;#x43D;&amp;#x435; &amp;#x43D;&amp;#x430; &amp;#x437;&amp;#x430;&amp;#x43F;&amp;#x438;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x435; &amp;#x43E;&amp;#x442; browser-&amp;#x430;. &amp;#xA0;&amp;#x41F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x437; Routing &amp;#x441;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x435;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x430;, &amp;#x43A;&amp;#x43E;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x44F;, &amp;#x43A;&amp;#x43E;&amp;#x439; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x435;&amp;#x440; &amp;#x435; &amp;#x43E;&amp;#x442;&amp;#x433;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x43E;&amp;#x431;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x437;&amp;#x430;&amp;#x43F;&amp;#x438;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x43D;&amp;#x435;&amp;#x442;&amp;#x43E;. &amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x441;&amp;#x44A;&amp;#x43E;&amp;#x442;&amp;#x432;&amp;#x435;&amp;#x442;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x435;&amp;#x440; &amp;#x432;&amp;#x437;&amp;#x430;&amp;#x438;&amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x439;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430; &amp;#x441; &amp;#x431;&amp;#x438;&amp;#x437;&amp;#x43D;&amp;#x435;&amp;#x441; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;&amp;#x442;&amp;#x435;.\n&amp;#x41A;&amp;#x43E;&amp;#x438;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x430; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x447;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x430; ActiveRecord &amp;#x43E;&amp;#x431;&amp;#x435;&amp;#x43A;&amp;#x442;&amp;#x438;, &amp;#x43A;&amp;#x43E;&amp;#x438;&amp;#x442;&amp;#x43E; &amp;#x441;&amp;#x438; &amp;#x432;&amp;#x437;&amp;#x430;&amp;#x438;&amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x439;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x442; &amp;#x441; &amp;#x431;&amp;#x430;&amp;#x437;&amp;#x430;&amp;#x442;&amp;#x430; &amp;#x43E;&amp;#x442; &amp;#x434;&amp;#x430;&amp;#x43D;&amp;#x43D;&amp;#x438;. \n&amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43A;&amp;#x43E;&amp;#x43D;&amp;#x442;&amp;#x440;&amp;#x43E;&amp;#x43B;&amp;#x435;&amp;#x440;&amp;#x430; &amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x434;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x43C;&amp;#x43E;&amp;#x434;&amp;#x435;&amp;#x43B;&amp;#x438;&amp;#x442;&amp;#x435; &amp;#x43D;&amp;#x430; View Layer-a, &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x433;&amp;#x435;&amp;#x43D;&amp;#x435;&amp;#x440;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x438; &amp;#x438;&amp;#x437;&amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x449;&amp;#x430; &amp;#x43E;&amp;#x442;&amp;#x433;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x440; &amp;#x43D;&amp;#x430; &amp;#x431;&amp;#x440;&amp;#x430;&amp;#x443;&amp;#x437;&amp;#x44A;&amp;#x440;&amp;#x430;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43E;&amp;#x442;&amp;#x433;&amp;#x43E;&amp;#x432;&amp;#x43E;&amp;#x440; &amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x435; &amp;#x434;&amp;#x430; &amp;#x435; html, xml, json, JavaScript &amp;#x438;&amp;#x43B;&amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433; &amp;#x43A;&amp;#x43E;&amp;#x434;.\n\n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. Taskar e &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x447;&amp;#x440;&amp;#x435;&amp;#x437; &amp;#xA0;&amp;#x422;est Driven Development &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x430;, &amp;#x447;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x430; &amp;#x438;&amp;#x434;&amp;#x435;&amp;#x44F; &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x43A;&amp;#x43E;&amp;#x434; &amp;#x432; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438;:\n&amp;#x41F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;, &amp;#x437;&amp;#x430; &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x43D;&amp;#x435; &amp;#x441;&amp;#x44A;&amp;#x449;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x443;&amp;#x432;&amp;#x430;&amp;#x449; &amp;#x43A;&amp;#x43E;&amp;#x434;. &amp;#x41A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x440;&amp;#x44F;&amp;#x431;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x430;&amp;#x440;&amp;#x43A;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x435;&amp;#x43D;\n&amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x432;&amp;#x44A;&amp;#x437;&amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x44F; &amp;#x43A;&amp;#x43E;&amp;#x434;, &amp;#x441; &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x43D;&amp;#x43E;.\n&amp;#x41D;&amp;#x430;&amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x44F; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43F;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430;, &amp;#x438;&amp;#x437;&amp;#x447;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;, &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;.\n\n&amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x437;&amp;#x438; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x44F;&amp;#x442; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x43A;&amp;#x44A;&amp;#x441;&amp;#x43D;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x432; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x446;&amp;#x435;&amp;#x441;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x446;&amp;#x44F;&amp;#x43B;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430; &amp;#x433;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x447;&amp;#x435; 100% &amp;#x43E;&amp;#x442; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430; &amp;#x449;&amp;#x435; &amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x43A;&amp;#x440;&amp;#x438;&amp;#x442; &amp;#x441; &amp;#x430;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435;. &amp;#x41A;&amp;#x43E;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x438; &amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x434;&amp;#x440;&amp;#x44A;&amp;#x436;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x441; &amp;#x43F;&amp;#x43E;--&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x44A;&amp;#x440; &amp;#x434;&amp;#x438;&amp;#x437;&amp;#x430;&amp;#x439;&amp;#x43D;. &amp;#xA0;&amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x430; Red-Green-Blue &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;.\n&amp;#xA0;\n\n
  75. Taskar e &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x447;&amp;#x440;&amp;#x435;&amp;#x437; &amp;#xA0;&amp;#x422;est Driven Development &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x430;, &amp;#x447;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x430; &amp;#x438;&amp;#x434;&amp;#x435;&amp;#x44F; &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x43A;&amp;#x43E;&amp;#x434; &amp;#x432; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438;:\n&amp;#x41F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;, &amp;#x437;&amp;#x430; &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x43D;&amp;#x435; &amp;#x441;&amp;#x44A;&amp;#x449;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x443;&amp;#x432;&amp;#x430;&amp;#x449; &amp;#x43A;&amp;#x43E;&amp;#x434;. &amp;#x41A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x440;&amp;#x44F;&amp;#x431;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x430;&amp;#x440;&amp;#x43A;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x435;&amp;#x43D;\n&amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x432;&amp;#x44A;&amp;#x437;&amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x44F; &amp;#x43A;&amp;#x43E;&amp;#x434;, &amp;#x441; &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x43D;&amp;#x43E;.\n&amp;#x41D;&amp;#x430;&amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x44F; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43F;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430;, &amp;#x438;&amp;#x437;&amp;#x447;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;, &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;.\n\n&amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x437;&amp;#x438; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x44F;&amp;#x442; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x43A;&amp;#x44A;&amp;#x441;&amp;#x43D;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x432; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x446;&amp;#x435;&amp;#x441;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x446;&amp;#x44F;&amp;#x43B;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430; &amp;#x433;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x447;&amp;#x435; 100% &amp;#x43E;&amp;#x442; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430; &amp;#x449;&amp;#x435; &amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x43A;&amp;#x440;&amp;#x438;&amp;#x442; &amp;#x441; &amp;#x430;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435;. &amp;#x41A;&amp;#x43E;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x438; &amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x434;&amp;#x440;&amp;#x44A;&amp;#x436;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x441; &amp;#x43F;&amp;#x43E;--&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x44A;&amp;#x440; &amp;#x434;&amp;#x438;&amp;#x437;&amp;#x430;&amp;#x439;&amp;#x43D;. &amp;#xA0;&amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x430; Red-Green-Blue &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;.\n&amp;#xA0;\n\n
  76. Taskar e &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x447;&amp;#x440;&amp;#x435;&amp;#x437; &amp;#xA0;&amp;#x422;est Driven Development &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x430;, &amp;#x447;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x430; &amp;#x438;&amp;#x434;&amp;#x435;&amp;#x44F; &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x43A;&amp;#x43E;&amp;#x434; &amp;#x432; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438;:\n&amp;#x41F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;, &amp;#x437;&amp;#x430; &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x43D;&amp;#x435; &amp;#x441;&amp;#x44A;&amp;#x449;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x443;&amp;#x432;&amp;#x430;&amp;#x449; &amp;#x43A;&amp;#x43E;&amp;#x434;. &amp;#x41A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x440;&amp;#x44F;&amp;#x431;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x430;&amp;#x440;&amp;#x43A;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x435;&amp;#x43D;\n&amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x432;&amp;#x44A;&amp;#x437;&amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x44F; &amp;#x43A;&amp;#x43E;&amp;#x434;, &amp;#x441; &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x43D;&amp;#x43E;.\n&amp;#x41D;&amp;#x430;&amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x44F; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43F;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430;, &amp;#x438;&amp;#x437;&amp;#x447;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;, &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;.\n\n&amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x437;&amp;#x438; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x44F;&amp;#x442; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x43A;&amp;#x44A;&amp;#x441;&amp;#x43D;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x432; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x446;&amp;#x435;&amp;#x441;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x446;&amp;#x44F;&amp;#x43B;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430; &amp;#x433;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x447;&amp;#x435; 100% &amp;#x43E;&amp;#x442; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430; &amp;#x449;&amp;#x435; &amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x43A;&amp;#x440;&amp;#x438;&amp;#x442; &amp;#x441; &amp;#x430;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435;. &amp;#x41A;&amp;#x43E;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x438; &amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x434;&amp;#x440;&amp;#x44A;&amp;#x436;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x441; &amp;#x43F;&amp;#x43E;--&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x44A;&amp;#x440; &amp;#x434;&amp;#x438;&amp;#x437;&amp;#x430;&amp;#x439;&amp;#x43D;. &amp;#xA0;&amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x430; Red-Green-Blue &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;.\n&amp;#xA0;\n\n
  77. Taskar e &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x435;&amp;#x43D; &amp;#x447;&amp;#x440;&amp;#x435;&amp;#x437; &amp;#xA0;&amp;#x422;est Driven Development &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x43B;&amp;#x43E;&amp;#x433;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x430;, &amp;#x447;&amp;#x438;&amp;#x44F;&amp;#x442;&amp;#x43E; &amp;#x43E;&amp;#x441;&amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x43D;&amp;#x430; &amp;#x438;&amp;#x434;&amp;#x435;&amp;#x44F; &amp;#x435; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x43A;&amp;#x43E;&amp;#x434; &amp;#x432; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438;:\n&amp;#x41F;&amp;#x44A;&amp;#x440;&amp;#x432;&amp;#x43E; &amp;#x441;&amp;#x435; &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;, &amp;#x437;&amp;#x430; &amp;#x432;&amp;#x441;&amp;#x435; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x43D;&amp;#x435; &amp;#x441;&amp;#x44A;&amp;#x449;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x443;&amp;#x432;&amp;#x430;&amp;#x449; &amp;#x43A;&amp;#x43E;&amp;#x434;. &amp;#x41A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x440;&amp;#x44F;&amp;#x431;&amp;#x432;&amp;#x430; &amp;#x434;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43C;&amp;#x430;&amp;#x440;&amp;#x43A;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x43A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x43D;&amp;#x435; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x435;&amp;#x43D;\n&amp;#x421;&amp;#x43B;&amp;#x435;&amp;#x434; &amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x438;&amp;#x448;&amp;#x435; &amp;#x432;&amp;#x44A;&amp;#x437;&amp;#x43C;&amp;#x43E;&amp;#x436;&amp;#x43D;&amp;#x43E; &amp;#x43D;&amp;#x430;&amp;#x439;-&amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x441;&amp;#x442;&amp;#x438;&amp;#x44F; &amp;#x43A;&amp;#x43E;&amp;#x434;, &amp;#x441; &amp;#x43A;&amp;#x43E;&amp;#x439;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x430; &amp;#x43C;&amp;#x438;&amp;#x43D;&amp;#x430;&amp;#x432;&amp;#x430; &amp;#x443;&amp;#x441;&amp;#x43F;&amp;#x435;&amp;#x448;&amp;#x43D;&amp;#x43E;.\n&amp;#x41D;&amp;#x430;&amp;#x43A;&amp;#x440;&amp;#x430;&amp;#x44F; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F; &amp;#x43F;&amp;#x43E; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430;, &amp;#x438;&amp;#x437;&amp;#x447;&amp;#x438;&amp;#x441;&amp;#x442;&amp;#x432;&amp;#x430;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x440;&amp;#x435;&amp;#x43D;&amp;#x438;&amp;#x44F;, &amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x430;&amp;#x432;&amp;#x44F;&amp;#x442; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x43E;&amp;#x432;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435; &amp;#x438; &amp;#x434;&amp;#x440;&amp;#x443;&amp;#x433;&amp;#x438;.\n\n&amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x442;&amp;#x435;&amp;#x437;&amp;#x438; 3 &amp;#x441;&amp;#x442;&amp;#x44A;&amp;#x43F;&amp;#x43A;&amp;#x438; &amp;#x441;&amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x432;&amp;#x442;&amp;#x430;&amp;#x440;&amp;#x44F;&amp;#x442; &amp;#x43D;&amp;#x435;&amp;#x43F;&amp;#x440;&amp;#x435;&amp;#x43A;&amp;#x44A;&amp;#x441;&amp;#x43D;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x432; &amp;#x43F;&amp;#x440;&amp;#x43E;&amp;#x446;&amp;#x435;&amp;#x441;&amp;#x430; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x437;&amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x43A;&amp;#x430;. &amp;#x41A;&amp;#x430;&amp;#x442;&amp;#x43E; &amp;#x446;&amp;#x44F;&amp;#x43B;&amp;#x43E; &amp;#x442;&amp;#x43E;&amp;#x437;&amp;#x438; &amp;#x43C;&amp;#x435;&amp;#x442;&amp;#x43E;&amp;#x434; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430; &amp;#x433;&amp;#x430;&amp;#x440;&amp;#x430;&amp;#x43D;&amp;#x442;&amp;#x438;&amp;#x440;&amp;#x430; &amp;#x447;&amp;#x435; 100% &amp;#x43E;&amp;#x442; &amp;#x43A;&amp;#x43E;&amp;#x434;&amp;#x430; &amp;#x449;&amp;#x435; &amp;#x435; &amp;#x43F;&amp;#x43E;&amp;#x43A;&amp;#x440;&amp;#x438;&amp;#x442; &amp;#x441; &amp;#x430;&amp;#x432;&amp;#x442;&amp;#x43E;&amp;#x43C;&amp;#x430;&amp;#x442;&amp;#x438;&amp;#x447;&amp;#x43D;&amp;#x438; &amp;#x442;&amp;#x435;&amp;#x441;&amp;#x442;&amp;#x43E;&amp;#x432;&amp;#x435;. &amp;#x41A;&amp;#x43E;&amp;#x435;&amp;#x442;&amp;#x43E; &amp;#x433;&amp;#x43E; &amp;#x43F;&amp;#x440;&amp;#x430;&amp;#x432;&amp;#x438; &amp;#x43B;&amp;#x435;&amp;#x441;&amp;#x435;&amp;#x43D; &amp;#x437;&amp;#x430; &amp;#x43F;&amp;#x43E;&amp;#x434;&amp;#x434;&amp;#x440;&amp;#x44A;&amp;#x436;&amp;#x43A;&amp;#x430; &amp;#x438; &amp;#x441; &amp;#x43F;&amp;#x43E;--&amp;#x434;&amp;#x43E;&amp;#x431;&amp;#x44A;&amp;#x440; &amp;#x434;&amp;#x438;&amp;#x437;&amp;#x430;&amp;#x439;&amp;#x43D;. &amp;#xA0;&amp;#x422;&amp;#x43E;&amp;#x432;&amp;#x430; &amp;#x43E;&amp;#x449;&amp;#x435; &amp;#x441;&amp;#x435; &amp;#x43D;&amp;#x430;&amp;#x440;&amp;#x438;&amp;#x447;&amp;#x430; Red-Green-Blue &amp;#x43D;&amp;#x430;&amp;#x447;&amp;#x438;&amp;#x43D; &amp;#x43D;&amp;#x430; &amp;#x440;&amp;#x430;&amp;#x431;&amp;#x43E;&amp;#x442;&amp;#x430;.\n&amp;#xA0;\n\n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n