рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдкреНрд░рд╛рдп: рдбрдХрд░рдХреЛ рд▓рд╛рдЧрд┐ рдЖрдзрд╛рд░ рдЫрд╡рд┐рдХреЛ рд░реВрдкрдорд╛ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдиреНрдЫред рддрдкрд╛рдИрдВрд▓рд╛рдИ рднрдирд┐рдПрдХреЛ рдЫ рдХрд┐ рдЕрд▓реНрдкрд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрдкрд╛рдИрдВрдХреЛ рдирд┐рд░реНрдорд╛рдгрд╣рд░реВ рд╕рд╛рдирд╛ рдмрдирд╛рдЙрдБрджрдЫ рд░ рддрдкрд╛рдИрдВрдХреЛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЫрд┐рдЯреЛ рдмрдирд╛рдЙрдБрджрдЫред
рддрд░ рдпрджрд┐ рддрдкрд╛рдЗрдБ рдкрд╛рдЗрдерди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ:
- рддрдкрд╛рдИрдВрдХреЛ рдирд┐рд░реНрдорд╛рдг рдзреЗрд░реИ рд╕реБрд╕реНрдд рдмрдирд╛рдЙрдБрдЫ
- рддрдкрд╛рдИрдВрдХреЛ рдЫрд╡рд┐рд╣рд░реВ рдареВрд▓реЛ рдмрдирд╛рдЙрдБрдЫ
- рдЖрдлреНрдиреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдЧрд░реНрджреИ
- рд░ рдЕрдиреНрддрдорд╛ рдпрд╕рд▓реЗ рд░рдирдЯрд╛рдЗрдордорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫ
рдЕрд▓реНрдкрд╛рдЗрди рдХрд┐рди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫ рд╣реЗрд░реМрдВ, рддрд░ рдХрд┐рди рддрдкрд╛рдИрдВрд▓реЗ рдЕрдЭреИ рдкрдирд┐ рдпрд╕рд▓рд╛рдИ рдкрд╛рдЗрдердирд╕рдБрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред
рдорд╛рдирд┐рд╕рд╣рд░реВ рдХрд┐рди рдЕрд▓реНрдкрд╛рдЗрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрдЫрдиреН?
рдорд╛рдиреМрдВ рдХрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ gcc рдЪрд╛рд╣рд┐рдиреНрдЫ рд░ рд╣рд╛рдореА рдирд┐рд░реНрдорд╛рдг рдЧрддрд┐ рд░ рдЕрдиреНрддрд┐рдо рдЫрд╡рд┐ рдЖрдХрд╛рд░рдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдмрдирд╛рдо Ubuntu 18.04 рддреБрд▓рдирд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред
рдкрд╣рд┐рд▓реЗ, рджреБрдИ рддрд╕реНрдмрд┐рд░рд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрдХрд╛рд░ рддреБрд▓рдирд╛ рдЧрд░реМрдВ:
$ docker pull --quiet ubuntu:18.04
docker.io/library/ubuntu:18.04
$ docker pull --quiet alpine
docker.io/library/alpine:latest
$ docker image ls ubuntu:18.04
REPOSITORY TAG IMAGE ID SIZE
ubuntu 18.04 ccc6e87d482b 64.2MB
$ docker image ls alpine
REPOSITORY TAG IMAGE ID SIZE
alpine latest e7d92cdc71fe 5.59MB
рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЕрд▓реНрдкрд╛рдЗрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдзреЗрд░реИ рд╕рд╛рдиреЛ рдЫред рдЕрдм gcc рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рд░ Ubuntu рд╕рдБрдЧ рд╕реБрд░реБ рдЧрд░реМрдВ:
FROM ubuntu:18.04
RUN apt-get update &&
apt-get install --no-install-recommends -y gcc &&
apt-get clean && rm -rf /var/lib/apt/lists/*
рдЙрддреНрддрдо Dockerfile рд▓реЗрдЦреНрдиреБ рдпрд╕ рд▓реЗрдЦрдХреЛ рджрд╛рдпрд░рд╛ рдмрд╛рд╣рд┐рд░ рдЫред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЧрддрд┐ рдорд╛рдкрди рдЧрд░реМрдВ:
$ time docker build -t ubuntu-gcc -f Dockerfile.ubuntu --quiet .
sha256:b6a3ee33acb83148cd273b0098f4c7eed01a82f47eeb8f5bec775c26d4fe4aae
real 0m29.251s
user 0m0.032s
sys 0m0.026s
$ docker image ls ubuntu-gcc
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-gcc latest b6a3ee33acb8 9 seconds ago 150MB
рд╣рд╛рдореА рдЕрд▓реНрдкрд╛рдЗрди (рдбрдХрд░рдлрд╛рдЗрд▓) рдХреЛ рд▓рд╛рдЧреА рдЙрд╣реА рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрдЫ:
FROM alpine
RUN apk add --update gcc
рд╣рд╛рдореА рднреЗрд▓рд╛ рдЧрд░реНрдЫреМрдВ, рд╡рд┐рдзрд╛рдирд╕рднрд╛рдХреЛ рд╕рдордп рд░ рдЖрдХрд╛рд░ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН:
$ time docker build -t alpine-gcc -f Dockerfile.alpine --quiet .
sha256:efd626923c1478ccde67db28911ef90799710e5b8125cf4ebb2b2ca200ae1ac3
real 0m15.461s
user 0m0.026s
sys 0m0.024s
$ docker image ls alpine-gcc
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine-gcc latest efd626923c14 7 seconds ago 105MB
рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдЧрд░реЗ рдЕрдиреБрд╕рд╛рд░, рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐рд╣рд░реВ рдЫрд┐рдЯреЛ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдиреНрдЫ рд░ рд╕рд╛рдирд╛ рд╣реБрдиреНрдЫрдиреН: 15 рдХреЛ рд╕рдЯреНрдЯрд╛ 30 рд╕реЗрдХреЗрдиреНрдб рд░ рдЫрд╡рд┐ рдЖрдХрд╛рд░ 105MB рдмрдирд╛рдо 150MB рд╣реЛред рдпреЛ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫ!
рддрд░ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЗрдерди рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕реНрд╡рд┐рдЪ рдЧрд░реНрдпреМрдВ рднрдиреЗ, рддрдм рд╕рдмреИ рдХреБрд░рд╛ рддреНрдпрддрд┐ рдЧреБрд▓рд╛рдмреА рд╣реБрдБрджреИрдиред
рдкрд╛рдЗрдерди рдЫрд╡рд┐
рдкрд╛рдЗрдерди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓реЗ рдкреНрд░рд╛рдп: рдкрд╛рдиреНрдбрд╛ рд░ рдореНрдпрд╛рдЯрдкреНрд▓реЛрдЯрд▓рд┐рдм рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рдПрдЙрдЯрд╛ рд╡рд┐рдХрд▓реНрдк рдпреЛ рдбрдХрд░рдлрд╛рдЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЗрдмрд┐рдпрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐ рд▓рд┐рди рд╣реЛ:
FROM python:3.8-slim
RUN pip install --no-cache-dir matplotlib pandas
рдпрд╕рд▓рд╛рдИ рд╕рдЩреНрдХрд▓рди рдЧрд░реМрдВ:
$ docker build -f Dockerfile.slim -t python-matpan.
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM python:3.8-slim
---> 036ea1506a85
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas
---> Running in 13739b2a0917
Collecting matplotlib
Downloading matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl (13.1 MB)
Collecting pandas
Downloading pandas-0.25.3-cp38-cp38-manylinux1_x86_64.whl (10.4 MB)
...
Successfully built b98b5dc06690
Successfully tagged python-matpan:latest
real 0m30.297s
user 0m0.043s
sys 0m0.020s
рд╣рд╛рдореАрд▓реЗ 363MB рд╕рд╛рдЗрдЬрдХреЛ рдЫрд╡рд┐ рдкрд╛рдЙрдБрдЫреМрдВред
рдХреЗ рд╣рд╛рдореА рдЕрд▓реНрдкрд╛рдЗрди рд╕рдВрдЧ рд░рд╛рдореНрд░реЛ рдЧрд░реНрдиреЗрдЫреМрдВ? рдкреНрд░рдпрд╛рд╕ рдЧрд░рд╛реИрдБ:
FROM python:3.8-alpine
RUN pip install --no-cache-dir matplotlib pandas
$ docker build -t python-matpan-alpine -f Dockerfile.alpine .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM python:3.8-alpine
---> a0ee0c90a0db
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas
---> Running in 6740adad3729
Collecting matplotlib
Downloading matplotlib-3.1.2.tar.gz (40.9 MB)
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/
tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"'; __file__='"'"'/tmp/pip-install-a3olrixa/matplotlib/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-a3olrixa/matplotlib/pip-egg-info
...
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
The command '/bin/sh -c pip install matplotlib pandas' returned a non-zero code: 1
рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ?
рдЕрд▓реНрдкрд╛рдЗрдирд▓реЗ рдкрд╛рдЩреНрдЧреНрд░рд╛рд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди
рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рд░реНрдорд╛рдгрд▓рд╛рдИ рд╣реЗрд░реНрдиреБрднрдпреЛ, рдЬреБрди рдбреЗрдмрд┐рдпрдирдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫ, рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ рдХрд┐ рдпрд╕рд▓реЗ matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64 рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдЫредwhl.
рдпреЛ рдкрд╛рдЩреНрдЧреНрд░рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдмрд╛рдЗрдирд░реА рд╣реЛред рдЕрд▓реНрдкрд╛рдЗрди рд╕реНрд░реЛрддрд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдЫ `matplotlib-3.1.2.tarредgz' рдХрд┐рдирдХрд┐ рдпрд╕рд▓реЗ рдорд╛рдирдХрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди
рдХрд┐рди? рдзреЗрд░реИ рдЬрд╕реЛ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгрд╣рд░реВрд▓реЗ C рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ GNU рд╕рдВрд╕реНрдХрд░рдг (glibc) рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЬреБрди рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкрд╛рдЗрдерди рд╕рд╣рд┐рдд C рдорд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫред рддрд░ рдЕрд▓реНрдкрд╛рдЗрдирд▓реЗ `musl` рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рд░ рддреА рдмрд╛рдЗрдирд░реАрд╣рд░реВ `glibc` рдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рддрд┐рдиреАрд╣рд░реВ рдХреЗрд╡рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЗрдирдиреНред
рддреНрдпрд╕рдХрд╛рд░рдг, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЕрд▓реНрдкрд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдЗрдерди рдкреНрдпрд╛рдХреЗрдЬрдорд╛ C рдорд╛ рд▓реЗрдЦрд┐рдПрдХрд╛ рд╕рдмреИ рдХреЛрдбрд╣рд░реВ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдУрд╣, рд╣реЛ, рддрдкрд╛рдИрд▓реЗ рд╕рдмреИ рддреНрдпрд╕реНрддрд╛ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдЦреЛрдЬреНрдиреБрдкрд░реНрдиреЗрдЫ рдЬреБрди рдЖрдлреИрд▓рд╛рдИ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореАрд▓реЗ рдпреЛ рдкрд╛рдЙрдБрдЫреМрдВ:
FROM python:3.8-alpine
RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
RUN pip install --no-cache-dir matplotlib pandas
рд░ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рд▓рд╛рдЧреНрдЫ ...
... реирел рдорд┐рдиреЗрдЯ релрен рд╕реЗрдХреЗрдиреНрдб! рд░ рдЫрд╡рд┐ рдЖрдХрд╛рд░ 25MB рдЫред
рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдзреЗрд░реИ рд╕рдордп рд▓рд╛рдЧреНрдЫ, рддрд┐рдиреАрд╣рд░реВ рдЖрдХрд╛рд░рдорд╛ рдареВрд▓рд╛ рд╣реБрдиреНрдЫрдиреН, рд░ рддрдкрд╛рдИрдВрд▓реЗ рдЕрдЭреИ рдкрдирд┐ рд╕рдмреИ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рдЦреЛрдЬреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддрдкрд╛рдЗрдБ рдкрдХреНрдХреИ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЖрдХрд╛рд░ рдХрдо рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рдпрддрд┐ рдорд╛рддреНрд░ рд╣реИрди!
рдЕрд▓реНрдкрд╛рдЗрдирд▓реЗ рд░рдирдЯрд╛рдЗрдордорд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрдЧрд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫ
- рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, musl glibc рд╕рдБрдЧ рдорд┐рд▓реНрджреЛ рдЫ, рддрд░ рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рднрд┐рдиреНрдирддрд╛рд╣рд░реВрд▓реЗ рдзреЗрд░реИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫред рд░ рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рдЫрдиреН рднрдиреЗ, рддрд┐рдиреАрд╣рд░реВ рд╕рдореНрднрд╡рддрдГ рдЕрдкреНрд░рд┐рдп рд╣реБрдиреЗрдЫрдиреНред рдпрд╣рд╛рдБ рдХреЗрд╣рд┐ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреН рдЬреБрди рдЙрддреНрдкрдиреНрди рд╣реБрди рд╕рдХреНрдЫ:
- рдЕрд▓реНрдкрд╛рдЗрдирд╕рдБрдЧ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рд╕рд╛рдиреЛ рдереНрд░реЗрдб рд╕реНрдЯреНрдпрд╛рдХ рд╕рд╛рдЗрдЬ рдЫ, рдЬрд╕рд▓реЗ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрди рд╕рдХреНрдЫ
Python рдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ - рдХреЗрд╣реА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдпреЛ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрдХрд╛ рдЫрдиреН
рдкрд╛рдЗрдерди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдврд┐рд▓реЛ рдЫрдиреН рдореБрд╕рд▓рд▓реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛рдХреЛ рдХрд╛рд░рдгрд▓реЗ (glibc рднрдиреНрджрд╛ рдлрд░рдХ)ред - рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдордзреНрдпреЗ рдПрдХ
рдорд┐рддрд┐ рдврд╛рдБрдЪрд╛ рдЧрд░реНрджрд╛ рддреНрд░реБрдЯрд┐ рднреЗрдЯрд┐рдпреЛ
рдкрдХреНрдХреИ рдкрдирд┐ рдпреА рддреНрд░реБрдЯрд┐рд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдЪреНрдпрд╛рдЗрд╕рдХреЗрдХрд╛ рдЫрдиреН, рддрд░ рдХрд╕рд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдЕрдЭреИ рдХрддрд┐ рд╣реБрдиреЗрдЫрдиреНред
рдкрд╛рдЗрдердирдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН
рдпрджрд┐ рддрдкрд╛рдИрдВ рдареВрд▓рд╛ рд░ рд▓рд╛рдореЛ рдирд┐рд░реНрдорд╛рдгрд╣рд░реВ, рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рд░ рд╕рдореНрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рдЦреЛрдЬреАрдорд╛ рдкрд░реЗрд╢рд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди рднрдиреЗ, рдЖрдзрд╛рд░ рдЫрд╡рд┐рдХреЛ рд░реВрдкрдорд╛ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд╕реНрд░реЛрдд: www.habr.com