Fintech рдорд╛, рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╛рдпрдГ рдзреЗрд░реИ рдареВрд▓реЛ рдорд╛рддреНрд░рд╛рдорд╛ рдореБрджреНрд░рд╛ рд╡рд┐рдирд┐рдордп рджрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреБрдкрд░реНрдЫред рд╣рд╛рдореАрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ, рд░ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рдЖрдлреНрдиреИ рд╡рд┐рдЪрд╛рд░ рдЫ рдХрд┐ рдХрд╕рд░реА рднреЛрд▓рд┐, рднреЛрд▓рд┐, рдЕрд░реНрдХреЛ рдорд╣рд┐рдирд╛ рд░ рдЕрд░реНрдХреЛ рддреАрди рд╡рд░реНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдирд┐рдордп рджрд░рд╣рд░реВ рдПрдХреНрд╕реНрдЯреНрд░рд╛рдкреЛрд▓реЗрдЯ рдЧрд░реНрдиреЗред рдпрджрд┐ рдХреЗрд╡рд▓ рдХрд╕реИрд▓реЗ рджрд░рд╣рд░реВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЧрд░реНрди рд╕рдХреНрдЫ рджрд╛рдпрд╛рдБ, рдпреЛ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдиреНрдж рдЧрд░реНрдиреЗ рд╕рдордп рд╣реБрдиреЗрдЫ рд░ рдХреЗрд╡рд▓ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрд╡рдХ рдкреИрд╕рд╛ рдлрд┐рд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдХреЗрд╣рд┐ рд╕реНрд░реЛрддрд╣рд░реВ рдЕрдзрд┐рдХ рднрд░рдкрд░реНрджреЛ рдЫрдиреН, рдХреЗрд╣рд┐ рдкреВрд░реНрдг рдлреЛрд╣реЛрд░ рдЖрдкреВрд░реНрддрд┐ рдЧрд░реНрджрдЫ, рд▓рдЧрднрдЧ рд╕рд╣реА рдорд╛рдирд╣рд░реВрдХреЛ рджреБрд░реНрд▓рдн рд╕рдорд╛рд╡реЗрд╢рдХреЛ рд╕рд╛рде, рддрд░ рд╡рд┐рджреЗрд╢реА рдЬреЛрдбреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред рд╣рд╛рдореНрд░реЛ рдХрд╛рдо рднрдиреЗрдХреЛ рдпреА рджрд╢реМрдВ рд╣рдЬрд╛рд░ рдорд╛рдирд╣рд░реВ рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб рдорд╛рд░реНрдлрдд рдЫрд╛рдиреНрдиреБ рд░ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рдХреЗ рджреЗрдЦрд╛рдЙрдиреЗ рднрдиреЗрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрдиреБ рд╣реЛред рд╣рд╛рдореАрд▓реЗ рдлреНрд▓реЗрдорд┐рдЩреНрдЧреЛрд╣рд░реВ рдЦрд╛рдЬрд╛рдорд╛ рдЧрд░реЗрдЭреИрдВ рдзреЗрд░реИ рдЯрди рдлреЛрд╣реЛрд░ рд░ рд╕рд┐рд▓реНрдЯрдмрд╛рдЯ рдПрдЙрдЯрд╛ рд╕рд╣реА рдорд╛рди рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрдиреБрдкрд░реНрдЫред
рдлреНрд▓реЗрдорд┐рдЩреНрдЧреЛрдХреЛ рдПрдЙрдЯрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рднрдиреЗрдХреЛ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдареВрд▓реЛ рддрд▓рддрд┐рд░ рдШреБрдореЗрдХреЛ рдЪреБрдЪреНрдЪреЛ рд╣реЛ, рдЬрд╕рдХреЛ рд╕рд╛рде рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдкрд╛рдиреА рд╡рд╛ рдорд╛рдЯреЛрдмрд╛рдЯ рдЦрд╛рдирд╛ рдЫрд╛рдиреНрдЫрдиреНред
-Wiki
рдпрд╕рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ рдЬрдиреНрдо рднрдпреЛ Vela
рдорд╛рдиреМрдВ рд╣рд╛рдореА рддреАрди рдореБрджреНрд░рд╛ рдЬреЛрдбреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рджрд░рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫреМрдВред рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ Vela
рд╣рд╛рд▓рдХреЛ рдЕрд╡рд╕реНрдерд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдпреЛ рдХреЗрд╣рд┐ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel.<=/2],
eurgbp: [limit: 3, errors: 1],
eurcad: [validator: Pairs]
@behaviour Vela.Validator
@impl Vela.Validator
def valid?(:eurcad, rate), do: rate > 0
end
рдорд╛рдирд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрджреИ
Vela.put/3
- рдХрд╛рд░рдг рд╣реБрдиреЗрдЫ
validator
рдорд╛рдирдорд╛, рдпрджрд┐ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ (рдЕрдзреНрдпрд╛рдп рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддрд▓); - рдорд╛рдиреНрдпрдХрд░рдг рд╕рдлрд▓ рднрдПрдорд╛ рд░рд╛рдореНрд░реЛ рдорд╛рдирдХреЛ рдкрдЩреНрдХреНрддрд┐рдорд╛ рд╡рд╛ рд╕реЗрд╡рд╛ рдкрдЩреНрдХреНрддрд┐рдорд╛ рдорд╛рди рдердкреНрдиреЗрдЫред
:__errors__
рдЕрдиреНрдпрдерд╛; - рдпрджрд┐ рдХреНрд░рдордмрджреНрдз рд╣реБрдиреЗрдЫ
sorter
рджрд┐рдЗрдПрдХреЛ рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд, рд╡рд╛ рдХреЗрд╡рд▓ рд╕реВрдЪреАрдХреЛ рдЯрд╛рдЙрдХреЛрдорд╛ рдорд╛рди рд░рд╛рдЦреНрдиреЗрдЫ (LIFO, рдЕрдзреНрдпрд╛рдп рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдХреНрд░рдордмрджреНрдз рдЧрд░реНрджреИ рддрд▓); - рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЕрдиреБрд╕рд╛рд░ рдкрдЩреНрдХреНрддрд┐ рдЯреНрд░рд┐рдо рдЧрд░реНрдиреЗрдЫ
:limit
рд╕реГрд╖реНрдЯрд┐рдорд╛ рдкрд╛рд░рд┐рдд; - рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ
Vela
.
iex|1 > pairs = %Pairs{}
iex|2 > Vela.put(pairs, :eurcad, 1.0)
#тЗТ %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(pairs, :eurcad, -1.0)
#тЗТ %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > pairs |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#тЗТ %Pairs{... eurusd: [1.0, 2.0]}
рд╕рд╛рдереИ Vela
рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ Access
Kernel
Kernel.get_in/2
Kernel.put_in/3
Kernel.update_in/3
Kernel.pop_in/2
Kernel.get_and_update_in/3
рдкреНрд░рдорд╛рдгреАрдХрд░рдг
рдПрдХ рдорд╛рдиреНрдпрдХрд░реНрддрд╛ рдирд┐рдореНрди рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:
- рдПрдХ рддрд░реНрдХ рд╕рдВрдЧ рдмрд╛рд╣реНрдп рдкреНрд░рдХрд╛рд░реНрдп (
&MyMod.my_fun/1
), рдпрд╕рд▓реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫ; - рджреБрдИ рддрд░реНрдХ рд╕рдВрдЧ рдмрд╛рд╣реНрдп рдкреНрд░рдХрд╛рд░реНрдп,
&MyMod.my_fun/2
, рдЙрд╕рд▓реЗ рдПрдХ рдЬреЛрдбреА рдкрд╛рдЙрдиреЗрдЫserie, value
рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреА; - рдореЛрдбреНрдпреБрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
;Vela.Validator
- рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░
threshold
, рд░ - рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдкрдорд╛ -compare_by
, рдЕрдзреНрдпрд╛рдп рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рддреБрд▓рдирд╛ рддрд▓
рдпрджрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдлрд▓ рднрдпреЛ рднрдиреЗ, рдорд╛рди рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреБрдЮреНрдЬреА рдЕрдиреНрддрд░реНрдЧрдд рд╕реВрдЪреАрдорд╛ рдердкрд┐рдиреНрдЫ; рдЕрдиреНрдпрдерд╛, рдЯрдкрд▓ {serie, value}
рдорд╛ рдЬрд╛рдиреНрдЫ :__errors_
.
рддреБрд▓рдирд╛
рдпреА рдкрдЩреНрдХреНрддрд┐рд╣рд░реВрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХрд╛ рдорд╛рдирд╣рд░реВ рдЬреБрдирд╕реБрдХреИ рд╣реБрди рд╕рдХреНрдЫрдиреНред рдкрдврд╛рдЙрдиреБ Vela
рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рддреБрд▓рдирд╛ рдЧрд░реНрди, рдпреЛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ compare_by
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ (рдорд╛рдирд╣рд░реВ рдорд╛рдирдХрд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди Kernel.</2
); рдпреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрд░рдХрд╛рд░рдХреЛ рд╣реБрдиреБрдкрд░реНрдЫ (Vela.value() -> number())
ред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдпреЛ рд╕рд░рд▓ рдЫ & &1
.
рд╕рд╛рдереИ, рддрдкрд╛рдЗрдБ рдкрдЩреНрдХреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ comparator
рдбреЗрд▓реНрдЯрд╛ рдорд╛рдирд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрди (min
/max
); рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреНрд░рд╕рд╛рд░рдг рджреНрд╡рд╛рд░рд╛ Date.diff/2
рддреБрд▓рдирд╛рдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдорд┐рддрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╣реА рдбреЗрд▓реНрдЯрд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрд░реНрдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░рд┐рдХрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд╛рд╕ рдЧрд░реНрдиреБ рд╣реЛ threshold
, рдЬрд╕рд▓реЗ рдирдпрд╛рдБ рдорд╛рдирдХреЛ рдЕрдзрд┐рдХрддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЕрдиреБрдкрд╛рдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрджрдЫ {min, max}
рдЕрдиреНрддрд░рд╛рд▓ред рдпреЛ рдкреНрд░рддрд┐рд╢рддрдХреЛ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рдЪреЗрдХрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрди comparator
рддрд░ рдЕрдЭреИ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ compare_by
ред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдорд┐рддрд┐ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрдкрд░реНрдЫ compare_by: &DateTime.to_unix/1
(рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди) рд░ threshold: 1
, рдирдпрд╛рдБ рдорд╛рдирд╣рд░реВ рднрд┐рддреНрд░ рдЫрдиреН рднрдиреЗ рдорд╛рддреНрд░ рдЕрдиреБрдорддрд┐ рджрд┐рдЗрдиреЗ рдХрд╛рд░рдг ┬▒band
рд╡рд░реНрддрдорд╛рди рдорд╛рдирд╣рд░реВрдмрд╛рдЯ рдЕрдиреНрддрд░рд╛рд▓ред
рдЕрдиреНрддрдорд╛, рддрдкрд╛рдИрдВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ Vela.equal?/2
рджреБрдИ рдХреНрдпрд╛рд╕ рддреБрд▓рдирд╛ рдЧрд░реНрдиред рдпрджрд┐ рдорд╛рдирд╣рд░реВрд▓реЗ рдкреНрд░рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрджрдЫ equal?/2
рд╡рд╛ compare/2
, рддреНрдпрд╕рдкрдЫрд┐ рдпреА рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫ, рдЕрдиреНрдпрдерд╛ рд╣рд╛рдореА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ ==/2
.
рдореВрд▓реНрдпрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ
рд╣рд╛рд▓рдХреЛ рдЕрд╡рд╕реНрдерд╛рдХреЛ рдкреНрд░рд╢реЛрдзрди рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХрд▓рдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдиреНрдЫ Vela.purge/1
, рдЬрд╕рд▓реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╣рд░реВ рд╣рдЯрд╛рдЙрдБрдЫ (рдпрджрд┐ validator
рдмрд╛рдБрдзрд┐рдПрдХреЛ timestamps
)ред рддреНрдпрд╕рдкрдЫрд┐ рдХрд▓ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ Vela.slice/1
рдЬреБрди рдлрд┐рд░реНрддрд╛ рд╣реБрдиреЗрдЫ keyword
рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рдкрд╣рд┐рд▓реЛ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкрдЩреНрдХреНрддрд┐ рдирд╛рдорд╣рд░реВред
рддрдкрд╛рдИрдВ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ get_in/2
/pop_in/2
рдкреНрд░рддреНрдпреЗрдХ рдкрдЩреНрдХреНрддрд┐рдорд╛ рдорд╛рдирд╣рд░реВрдорд╛ рдирд┐рдореНрди-рд╕реНрддрд░ рдкрд╣реБрдБрдЪрдХреЛ рд▓рд╛рдЧрд┐ред
рдЕрдиреБрдкреНрд░рдпреЛрдЧ
Vela
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд╡рд╕реНрдерд╛ рдЬрд╕реНрддреИ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреНрдпрд╛рд╕ рд░реВрдкрдорд╛ рдЕрддреНрдпрдиреНрдд рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫ GenServer
/Agent
ред рд╣рд╛рдореА рдмрд╛рд╕реА рдкрд╛рдареНрдпрдХреНрд░рдо рдорд╛рдирд╣рд░реВ рдХрд╣рд┐рд▓реНрдпреИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрдиреМрдВ, рд░ рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд░рд╛рдЬреНрдпрд╕рдБрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рд░рд╛рдЦреНрдЫреМрдВ Vela
, рддрд▓ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдорд╛рдиреНрдпрдХрд░реНрддрд╛ рд╕рдВрдЧред
@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
do: Rate.age(rate) < @death_age
╨╕ Vela.purge/1
рд╣рд╛рдореАрд▓рд╛рдИ рдбреЗрдЯрд╛ рдЪрд╛рд╣рд┐рдиреЗ рдмреЗрд▓рд╛рдорд╛ рдЪреБрдкрдЪрд╛рдк рд╕рдмреИ рдмрд╛рд╕реА рдорд╛рдирд╣рд░реВ рд╣рдЯрд╛рдЙрдБрдЫред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╣рд░реВ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╣рд╛рдореА рдХреЗрд╡рд▓ рдХрд▓ рдЧрд░реНрдЫреМрдВ Vela.slice/1
, рд░ рдЬрдм рдкрд╛рдареНрдпрдХреНрд░рдордХреЛ рд╕рд╛рдиреЛ рдЗрддрд┐рд╣рд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫ (рдкреВрд░рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛), рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫреМрдВ - рдкрд╣рд┐рд▓реЗ рдиреИ рдХреНрд░рдордмрджреНрдз - рдорд╛рдиреНрдп рдорд╛рдирд╣рд░реВрд╕рдБрдЧред
рд╢реБрдн рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреНрдпрд╛рд╕рд┐рдЩ!
рд╕реНрд░реЛрдд: www.habr.com