рдлрд┐рдирдЯреЗрдХрдордзреНрдпреЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдЪрд▓рди рд╡рд┐рдирд┐рдордп рджрд░ рдбреЗрдЯрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рд╛рд╡реА рд▓рд╛рдЧрддреЗ. рдЖрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдХрдбреВрди рдбреЗрдЯрд╛ рдорд┐рд│рддреЛ рдЖрдгрд┐ рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреА рд╕реНрд╡рддрдГрдЪреА рдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ рдХреА рдЙрджреНрдпрд╛, рдкрд░рд╡рд╛, рдкреБрдврдЪрд╛ рдорд╣рд┐рдирд╛ рдЖрдгрд┐ рдЕрдЧрджреА рдкреБрдвреАрд▓ рддреАрди рд╡рд░реНрд╖рд╛рдВрд╕рд╛рдареА рджрд░рд╛рдВрдЪреА рдореВрд▓реНрдпреЗ рдХрд╢реА рдПрдХреНрд╕реНрдЯреНрд░рд╛рдкреЛрд▓реЗрдЯ рдХрд░рд╛рдпрдЪреА. рдЬрд░ рдХреЛрдгреА рджрд░рд╛рдВрдЪрд╛ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡реВ рд╢рдХрддреЛ рдЙрдЬрд╡реАрдХрдбреЗ, рд╡реНрдпрд╡рд╕рд╛рдп рдмрдВрдж рдХрд░рдгреЗ рдЖрдгрд┐ рдлрдХреНрдд рдореВрд░реНрдЦрдкрдгрд╛рдиреЗ рдкреИрд╕реЗ рдкрд░рдд рдмрджрд▓рдгреЗ рдпреЛрдЧреНрдп рд╣реЛрдИрд▓. рдХрд╛рд╣реА рд╕реНрддреНрд░реЛрдд рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЖрд╣реЗрдд, рдХрд╛рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдХрдЪрд░рд╛ рдЖрд╣реЗрдд, рдЕрдзреВрдирдордзреВрди рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЬрд╡рд│-рдпреЛрдЧреНрдп рдореВрд▓реНрдпрд╛рдВрд╕рд╣, рдкрд░рдВрддреБ рд╡рд┐рджреЗрд╢реА рдЬреЛрдбрдкреНрдпрд╛рдВрд╕рд╛рдареА. рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рдпрд╛ рджрд╣рд╛ рд╣рдЬрд╛рд░реЛ рдореВрд▓реНрдпрд╛рдВрдЪрд╛ рд╢реЛрдз рдШреЗрдгреЗ рдЖрдгрд┐ рдЧреНрд░рд╛рд╣рдХрд╛рдВрдирд╛ рдиреЗрдордХреЗ рдХрд╛рдп рджрд╛рдЦрд╡рд╛рдпрдЪреЗ рд╣реЗ рдард░рд╡рдгреЗ рд╣реЗ рдЖрд╣реЗ. рдлреНрд▓реЗрдорд┐рдВрдЧреЛ рд░рд╛рддреНрд░реАрдЪреНрдпрд╛ рдЬреЗрд╡рдгрд╛рдд рдХрд░рддрд╛рдд рддреНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХ рдЯрди рдШрд╛рдг рдЖрдгрд┐ рдЧрд╛рд│ рдпрд╛рддреВрди рдПрдХрдЪ рдпреЛрдЧреНрдп рдореВрд▓реНрдп рдлрд┐рд▓реНрдЯрд░ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓.
рдлреНрд▓реЗрдорд┐рдВрдЧреЛрдЪреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рдЦрд╛рд▓реА-рд╡рдХреНрд░ рдЪреЛрдЪ, рдЬреНрдпрд╛рджреНрд╡рд╛рд░реЗ рддреЗ рдкрд╛рдгреА рдХрд┐рдВрд╡рд╛ рдЧрд╛рд│рд╛рддреВрди рдЕрдиреНрди рдлрд┐рд▓реНрдЯрд░ рдХрд░рддрд╛рдд.
-рд╡рд┐рдХреА
рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдЪрд╛ рдЬрдиреНрдо рдЭрд╛рд▓рд╛. 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
рджрд┐рд▓реЗрд▓реНрдпрд╛ рдХреА рд╕рд╛рдареА рдкрд░рд┐рднрд╛рд╖рд┐рдд, рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдореВрд▓реНрдп рд╕реВрдЪреАрдЪреНрдпрд╛ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдареЗрд╡рд╛ (рдирд┐рд░реНрдЬреАрд╡, рдзрдбрд╛ рдкрд╣рд╛ рд╡рд░реНрдЧреАрдХрд░рдг рдЦрд╛рд▓реА); - рдкреЕрд░рд╛рдореАрдЯрд░рдиреБрд╕рд╛рд░ рдкрдВрдХреНрддреА рдХрдЯ рдХрд░реЗрд▓
: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