рдЕрд▓реНрдкрд╛рдЗрди рдиреЗ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдмрд┐рд▓реНрдб рдХреЛ 50 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЫрд╡рд┐рдпрд╛рдВ 2 рдЧреБрдирд╛ рднрд╛рд░реА рд╣реИрдВ

рдЕрд▓реНрдкрд╛рдЗрди рдиреЗ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдмрд┐рд▓реНрдб рдХреЛ 50 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЫрд╡рд┐рдпрд╛рдВ 2 рдЧреБрдирд╛ рднрд╛рд░реА рд╣реИрдВ

рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдХреЛ рдЕрдХреНрд╕рд░ рдбреЙрдХрд░ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЕрд▓реНрдкрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреА рдмрд┐рд▓реНрдб рдЫреЛрдЯреА рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЖрдкрдХреА рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдЧреАред

рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣:

  • рдЖрдкрдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмрд╣реБрдд рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ
  • рдЖрдкрдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдбрд╝рд╛ рдмрдирд╛рддрд╛ рд╣реИ
  • рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛
  • рдФрд░ рдЕрдВрдд рдореЗрдВ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрд▓реНрдкрд╛рдЗрди рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреНрдпреЛрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЛрдЧ рдЕрд▓реНрдкрд╛рдЗрди рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ?

рдЖрдЗрдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреАрд╕реАрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдирд┐рд░реНрдорд╛рдг рдЧрддрд┐ рдФрд░ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдмрдирд╛рдо рдЙрдмрдВрдЯреВ 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

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИред рдЖрдЗрдП рдЕрдм рдЬреАрд╕реАрд╕реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЙрдмрдВрдЯреВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:

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 рд╕реЗрдХрдВрдб рдФрд░ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ 105 рдПрдордмреА рдмрдирд╛рдо 150 рдПрдордмреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╛рдпрдерди рдЫрд╡рд┐

рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдХреНрд╕рд░ рдкрд╛рдВрдбрд╛ рдФрд░ рдореИрдЯрдкреНрд▓реЛрдЯрд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЗрдмрд┐рдпрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐ рд▓реЗрдирд╛ рд╣реИ:

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'рдЪреВрдВрдХрд┐ рдпрд╣ рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдкрд╣рд┐рдпреЛрдВ.

рдХреНрдпреЛрдВ? рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рд╕реА рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЬреАрдПрдирдпреВ рд╕рдВрд╕реНрдХрд░рдг (рдЧреНрд▓рд┐рдмреИрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдпрдерди рд╕рдореЗрдд рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЕрд▓реНрдкрд╛рдЗрди `musl` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рд╡реЗ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ `glibc` рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╡реЗ рдмрд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрд▓реНрдкрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдУрд╣, рд╣рд╛рдБ, рдЖрдкрдХреЛ рдРрд╕реА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦрдиреА рд╣реЛрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:

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

рдФрд░ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ...

... 25 рдорд┐рдирдЯ 57 рд╕реЗрдХрдВрдб! рдФрд░ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ 851MB рд╣реИред

рдЕрд▓реНрдкрд╛рдЗрди-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рд╡реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реЗрдВрдмрд▓реА рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдирд┐рд░реНрдорд╛рдг рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд╡рд╣ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИрдВ!

рдЕрд▓реНрдкрд╛рдЗрди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрдЧ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

  • рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдорд╕рд▓ рдЧреНрд▓рд┐рдмреИрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдорддрднреЗрдж рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рд╡реЗ рдЕрдкреНрд░рд┐рдп рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
  • рдЕрд▓реНрдкрд╛рдЗрди рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдкрд╛рдпрдерди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ
  • рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЙрд╕реЗ рдвреВрдВрдв рд▓рд┐рдпрд╛ рд╣реИ рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдзреАрдореЗ рд╣реИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдорд╕рд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЧреНрд▓рд┐рдмреИрдХ рд╕реЗ рдЕрд▓рдЧ)ред
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджрд┐рдирд╛рдВрдХ рдХреЛ рдлрд╝реЙрд░реНрдореЗрдЯ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдФрд░ рдХрд┐рддрдиреА рд╣реЛрдВрдЧреАред

рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдк рдмрдбрд╝реЗ рдФрд░ рд▓рдВрдмреЗ рдмрд┐рд▓реНрдб, рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдПрдХ рдЕрдЪреНрдЫреА рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ