рдорд▓рд╛ рдЕрд╕реЗ рдХрд╕реЗ рдЬрдЧрд╛рдпрд▓рд╛ рдЖрд▓реЗ?
рдХрд╛рд╣реА рдХрд╛рд│рд╛рдкреВрд░реНрд╡реА рдорд▓рд╛ рдПрдХрд╛ рдЕрддреНрдпрдВрдд рднрд╛рд░рд┐рдд рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдмреЕрдХрдПрдВрдбрд╡рд░ рдХрд╛рдо рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ рд╣реЛрддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛ рдЖрдгрд┐ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реЗрд╡рд╛рдВрд╕рд╛рдареА рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╣ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореА рдХрд╛рд░реНрдпрд╛рдВрдЪреА рдирд┐рдпрдорд┐рдд рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ. рдкреНрд░рдХрд▓реНрдк рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЖрд╣реЗ рдЖрдгрд┐ рдореА рдпреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдХреНрд░реЙрди-рд▓рд╛рдБрдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдВрд╕рд╛рдареА рдПрдХ рд╕рд╛рдзреА рдпрдВрддреНрд░рдгрд╛ рд╣реЛрддреА: рд╡рд░реНрддрдорд╛рди рд╡реЗрд│ рддрдкрд╛рд╕рдгрд╛рд░реА рд▓реВрдк рдЖрдгрд┐ рдЧреЕрджрд░рджреНрд╡рд╛рд░реЗ рдХреЛрд░реЛрдЯреАрдирдЪреЗ рдЧрдЯ рд▓рд╛рдБрдЪ рдХрд░рдгреЗ - рд╣рд╛ рджреГрд╖реНрдЯреАрдХреЛрди рдбрдЭрдирднрд░ рдЖрдгрд┐ рд╢реЗрдХрдбреЛ рдХреЙрд░реЛрдЯреАрди рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╕реНрд╡реАрдХрд╛рд░реНрдп рдард░рд▓рд╛. рддрдерд╛рдкрд┐, рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рджреЛрди рд╣рдЬрд╛рд░рд╛рдВрд╣реВрди рдЕрдзрд┐рдХ рдЭрд╛рд▓реА, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рджрд▓рд╛рд▓, рдЕрдиреЗрдХ рдХрд╛рдордЧрд╛рд░ рдЗрддреНрдпрд╛рджреАрдВрд╕рд╣ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд░рд╛рдВрдЧ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛.
рдкреНрд░рдердо рдореА рд╕реЗрд▓реЗрд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛, рдЬреА рдореА рдЖрдзреА рд╡рд╛рдкрд░рд▓реА рд╣реЛрддреА. рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реНрд╡рд░реВрдкрд╛рдореБрд│реЗ, рдореА рдкреНрд░рд╢реНрдирд╛рдд рдбреБрдмрдХреА рдорд╛рд░рд▓реА рдЖрдгрд┐ рдкрд╛рд╣рд┐рд▓реЗ
рдореА рд╣реЗ рд╕рд╛рдВрдЧреЗрди, рд╣рд╛ рдкреНрд░рдХрд▓реНрдк рдЕрддрд┐рд╢рдп рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╕рдВрдШрд╛рдЪреНрдпрд╛ рдЗрддрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЛ рдЖрдгрд┐ рд▓реЗрдЦрдХ рд╕реНрд╡рддрдГ рдореНрд╣рдгрддреЛ рдХреА рддреЛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреВрд▓ рд╡рд╛рдкрд░реВрди рдЙрддреНрдкрд╛рджрдирд╛рдд рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛. рдкрд░рдВрддреБ, рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рддреЗ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╡реНрд╣рддреЗ, рдЬрд╕реЗ рддреЗ рдмрд╛рд╣реЗрд░ рдкрдбрд▓реЗ
рдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдореА рдкрд╛рд╣реВ рд▓рд╛рдЧрд▓реЛ рдкрд░реНрдпрд╛рдп рдЖрдгрд┐ рддреЗ рд╕рд╛рдкрдбрд▓реЗ! рднрд╛рдЬреА рдХрд┐рдВрд╡рд╛ рдХреЛрд╢рд┐рдВрдмреАрд░ рдмрдирд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдЕрд╢реА рдПрдХ рд╡рдирд╕реНрдкрддреА рдирд┐рд░реНрдорд╛рддреЗ, рд╡рд┐рд╢реЗрд╖рддрдГ, рдорд▓рд╛ рд╕рдордЬрддреЗ рдореНрд╣рдгреВрди
рддрд╕реЗрдЪ, рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛
рдЖрдореНрд╣реА рдХрд╛рдп рдХрд░реВ?
рддрд░, рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдЫреЛрдЯреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрдд, рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдлреЙрд╕реНрдЯ рд╡рд╛рдкрд░реВрди рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдВрдордзреВрди рдбреЗрдЯрд╛ рдХрд╕рд╛ рдЧреЛрд│рд╛ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рджрд╛рдЦрд╡рддреЛ. рдЖрдордЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рд╕реНрддреНрд░реЛрдд рдирд╛рд╡рд╛рдкреНрд░рдорд╛рдгреЗрдЪ рдЕрд╕реЗрд▓,
рдирд┐рд░реАрдХреНрд╖рдгрд╛рдЪрд╛ рдореБрджреНрджрд╛ рдЬреНрдпрд╛ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ рддреНрдпрд╛рдЪрд╛ рдЖрдзрд╛рд░ рдШреЗрдд, рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рд╡рд╛рдЪрдХ рдЕрдЬреВрдирд╣реА рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕реЗрд▓:
рдкреНрд░рдХрд▓реНрдк рдЖрд╡рд╢реНрдпрдХрддрд╛
рдореА рдЖрдзреАрдЪ рд╡рдЪрди рджрд┐рд▓реЗ рдЖрд╣реЗ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ, рд╕реЗрд╡рд╛ рдХрд╛рдп рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рд╛рд╡реА рдпрд╛рдЪреА рдПрдХ рдЫреЛрдЯреА рдпрд╛рджреА рдмрдирд╡реВрдпрд╛:
- рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреАрдЬ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдЕрдкрд▓реЛрдб рдХрд░рд╛ (рдирдлрд╛ рдЖрдгрд┐ рддреЛрдЯрд╛, рддрд╛рд│реЗрдмрдВрдж, рд░реЛрдЦ рдкреНрд░рд╡рд╛рд╣ - рдорд╛рдЧреАрд▓ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА) - рдирд┐рдпрдорд┐рддрдкрдгреЗ
- рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рд╛ (рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реЗрдбрд┐рдВрдЧ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА, рдЯреНрд░реЗрдбрд┐рдВрдЧрдЪреНрдпрд╛ рдмрдВрдж рдХрд┐рдВрдорддреАрдЪреА рдЕрддреНрдпрдВрдд рдореВрд▓реНрдпреЗ рд╢реЛрдзрд╛) - рдирд┐рдпрдорд┐рддрдкрдгреЗ
- рдирд╡реАрдирддрдо рдЯреНрд░реЗрдбрд┐рдВрдЧ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рд╛ - рдирд┐рдпрдорд┐рддрдкрдгреЗ
- рдкреНрд░рддреНрдпреЗрдХ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрд╕рд╛рдареА рд╕рдВрдХреЗрддрдХрд╛рдВрдЪреА рд╕рд╛рдиреБрдХреВрд▓рд┐рдд рд╕реВрдЪреА рдЕрдкрд▓реЛрдб рдХрд░рд╛ - рдирд┐рдпрдорд┐рддрдкрдгреЗ
рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ, рдЖрдореНрд╣реА рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдирд╛рд╡ рдирд┐рд╡рдбрддреЛ: рд╣реЙрд░реНрдЯрди
рдЖрдореНрд╣реА рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рддрдпрд╛рд░ рдХрд░рдд рдЖрд╣реЛрдд
рд╢реАрд░реНрд╖рдХ рдирдХреНрдХреАрдЪ рдордЬрдмреВрдд рдЖрд╣реЗ, рддрдерд╛рдкрд┐, рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдбреЙрдХрд░-рдХрдВрдкреЛрдЬрд╕рд╛рдареА рдХрд╛рдлреНрдХрд╛ (рдЖрдгрд┐ рдкреНрд░рд╛рдгреАрд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп - рдПрдХрд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ), рдХрд╛рдлреНрдбреНрд░реЙрдк (рдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╖рдпрд╛рдВрдордзреАрд▓ рд╕рдВрджреЗрд╢ рдкрд╣рд╛рдпрдЪреЗ рдЕрд╕рддреАрд▓ рддрд░), рдореЛрдВрдЧреЛрдбрдмрд╕рд╣ рдПрдХ рд▓рд╣рд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рдорд┐рд│рддреЗ [docker-compose.yml](
version: '3'
services:
db:
container_name: horton-mongodb-local
image: mongo:4.2-bionic
command: mongod --port 20017
restart: always
ports:
- 20017:20017
environment:
- MONGO_INITDB_DATABASE=horton
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=admin_password
kafka-service:
container_name: horton-kafka-local
image: obsidiandynamics/kafka
restart: always
ports:
- "2181:2181"
- "9092:9092"
environment:
KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-service:29092,EXTERNAL://localhost:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
KAFKA_RESTART_ATTEMPTS: "10"
KAFKA_RESTART_DELAY: "5"
ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"
kafdrop:
container_name: horton-kafdrop-local
image: 'obsidiandynamics/kafdrop:latest'
restart: always
ports:
- '9000:9000'
environment:
KAFKA_BROKERCONNECT: kafka-service:29092
depends_on:
- kafka-service
рдпреЗрдереЗ рдХрд╛рд╣реАрд╣реА рдХреНрд▓рд┐рд╖реНрдЯ рдирд╛рд╣реА. рдХрд╛рдлреНрдХрд╛рд╕рд╛рдареА рджреЛрди рд╢реНрд░реЛрддреЗ рдШреЛрд╖рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ: рдПрдХ (рдЕрдВрддрд░реНрдЧрдд) рд╕рдВрдпреБрдХреНрдд рдиреЗрдЯрд╡рд░реНрдХрдордзреНрдпреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рджреБрд╕рд░рд╛ (рдмрд╛рд╣реНрдп) рдмрд╛рд╣реЗрд░реВрди рдЖрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА, рдореНрд╣рдгреВрди рддреНрдпрд╛рдВрдиреА рддреЗ рдмрд╛рд╣реЗрд░ рдкрд╛рдард╡рд▓реЗ. 2181 - рдЭреВрдХреАрдкрд░ рдкреЛрд░реНрдЯ. рдмрд╛рдХреА, рдорд▓рд╛ рд╡рд╛рдЯрддреЗ, рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ.
рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рд╕рд╛рдВрдЧрд╛рдбрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ
рдореВрд│ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рд░рдЪрдирд╛ рдЕрд╢реА рджрд┐рд╕рд▓реА рдкрд╛рд╣рд┐рдЬреЗ:
horton
тФЬтФАтФА docker-compose.yml
тФФтФАтФА horton
тФЬтФАтФА agents.py *
тФЬтФАтФА alphavantage.py *
тФЬтФАтФА app.py *
тФЬтФАтФА config.py
тФЬтФАтФА database
тФВ тФЬтФАтФА connect.py
тФВ тФЬтФАтФА cruds
тФВ тФВ тФЬтФАтФА base.py
тФВ тФВ тФЬтФАтФА __init__.py
тФВ тФВ тФФтФАтФА security.py *
тФВ тФФтФАтФА __init__.py
тФЬтФАтФА __init__.py
тФЬтФАтФА records.py *
тФФтФАтФА tasks.py *
*рд╕рд░реНрд╡ рдХрд╛рд╣реА рдореА рдиреЛрдВрджрд╡рд▓реЗ рдЖрдореНрд╣реА рдЕрджреНрдпрд╛рдк рддреНрдпрд╛рд╕ рд╕реНрдкрд░реНрд╢ рдХрд░рдд рдирд╛рд╣реА, рдЖрдореНрд╣реА рдлрдХреНрдд рд░рд┐рдХреНрдд рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЛ.**
рдЖрдореНрд╣реА рдПрдХ рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХреЗрд▓реА. рдЖрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрди рдЬреЛрдбреВ, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд▓рд┐рд╣реВ рдЖрдгрд┐ mongodb рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░реВ. рдореА рд▓реЗрдЦрд╛рддреАрд▓ рдлрд╛рдпрд▓реАрдВрдЪрд╛ рд╕рдВрдкреВрд░реНрдг рдордЬрдХреВрд░ рдкреНрд░рджрд╛рди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдЬреЗрдгреЗрдХрд░реВрди рдЙрд╢реАрд░ рд╣реЛрдК рдирдпреЗ, рдкрд░рдВрддреБ рдореА рдЖрд╡рд╢реНрдпрдХ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреЗ рджреБрд╡реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрди.
рдЪрд▓рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдмрджреНрджрд▓ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЖрдгрд┐ рдореЗрдЯрд╛рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛ -
рдкреБрдвреЗ, рдЖрдореНрд╣реА рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рд╡реНрд╣рд░реНрдЪреБрдЕрд▓реЗрдирд╡реНрд╣ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░рддреЛ (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рд╕реНрд╡рддрдГ venv рдлреЛрд▓реНрдбрд░ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рдХреНрд░рд┐рдп рдХрд░реВ рд╢рдХрддрд╛):
pip3 install poetry (╨╡╤Б╨╗╨╕ ╨╡╤Й╤С ╨╜╨╡ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╛)
poetry install
рдЖрддрд╛ рддрдпрд╛рд░ рдХрд░реВ
рдореЛрдВрдЧреЛрд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛, рд╕рд░реНрд╡рдХрд╛рд╣реА рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ. рдШреЛрд╖рд┐рдд рдХреЗрд▓реЗ
рдкреБрдвреЗ рдХрд╛рдп рд╣реЛрдгрд╛рд░?
рд▓реЗрдЦ рдлрд╛рд░ рдореЛрдард╛ рдирд╛рд╣реА, рдХрд╛рд░рдг рдореА рдпреЗрдереЗ рдлрдХреНрдд рдкреНрд░реЗрд░рдгрд╛ рдЖрдгрд┐ рддрдпрд╛рд░реАрдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдорд▓рд╛ рджреЛрд╖ рджреЗрдК рдирдХрд╛ - рдореА рд╡рдЪрди рджреЗрддреЛ рдХреА рдкреБрдвреАрд▓ рднрд╛рдЧрд╛рдд рдХреГрддреА рдЖрдгрд┐ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЕрд╕рддреАрд▓.
рддрд░, рдпрд╛ рдкреБрдврдЪреНрдпрд╛ рднрд╛рдЧрд╛рдд рдЖрдореНрд╣реА:
- рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрд╕рд╣ aiohttp рд╡рд░ alphavantage рд╕рд╛рдареА рдПрдХ рд▓рд╣рд╛рди рдХреНрд▓рд╛рдпрдВрдЯ рд▓рд┐рд╣реВрдпрд╛.
- рдЪрд▓рд╛ рдПрдХ рдПрдЬрдВрдЯ рддрдпрд╛рд░ рдХрд░реВрдпрд╛ рдЬреЛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рдХреНрдпреБрд░рд┐рдЯреАрдЬ рдЖрдгрд┐ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд┐рдВрдорддреАрдВрдЪрд╛ рдбреЗрдЯрд╛ рдЧреЛрд│рд╛ рдХрд░реЗрд▓.
рд╕реНрддреНрд░реЛрдд: www.habr.com