เด†เตฝเดชเตˆเตป เดชเตˆเดคเตเดคเดฃเดฟเดจเดพเดฏเดฟ เดกเต‹เด•เตเด•เตผ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต 50 เดฎเดŸเด™เตเด™เต เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเดฃเต, เดšเดฟเดคเตเดฐเด™เตเด™เตพ 2 เดฎเดŸเด™เตเด™เต เดญเดพเดฐเดฎเตเดณเตเดณเดคเดพเดฃเต

เด†เตฝเดชเตˆเตป เดชเตˆเดคเตเดคเดฃเดฟเดจเดพเดฏเดฟ เดกเต‹เด•เตเด•เตผ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต 50 เดฎเดŸเด™เตเด™เต เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเดฃเต, เดšเดฟเดคเตเดฐเด™เตเด™เตพ 2 เดฎเดŸเด™เตเด™เต เดญเดพเดฐเดฎเตเดณเตเดณเดคเดพเดฃเต

เด†เตฝเดชเตˆเตป เดฒเดฟเดจเด•เตเดธเต เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดกเต‹เด•เตเด•เดฑเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดšเดฟเดคเตเดฐเดฎเดพเดฏเดฟ เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด†เตฝเดชเตˆเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฌเดฟเตฝเดกเตเด•เตพ เดšเต†เดฑเตเดคเดพเด•เตเด•เตเดฎเต†เดจเตเดจเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดฎเตเดฎเดพเดฃ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดตเต‡เด—เดคเตเดคเดฟเดฒเดพเด•เตเด•เตเดฎเต†เดจเตเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดชเตˆเดคเตเดคเตบ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดจเดฟเด™เตเด™เตพ Alpine Linux เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดคเต:

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฌเดฟเตฝเดกเต เดตเดณเดฐเต† เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดตเดฒเตเดคเดพเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเดฎเดฏเด‚ เดชเดพเดดเดพเด•เตเด•เตเดจเตเดจเต
  • เด…เดตเดธเดพเดจเด‚ เด‡เดคเต เดฑเตบเดŸเตˆเดฎเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพเด•เตเด•เต เด•เดพเดฐเดฃเดฎเดพเด•เตเด‚


เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด†เตฝเดชเตˆเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เดจเดฟเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเตˆเดคเตเดคเดฃเดฟเดจเตŠเดชเตเดชเด‚ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฐเตเดคเต.

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด†เดณเตเด•เตพ เด†เตฝเดชเตˆเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต?

เดžเด™เตเด™เดณเตเดŸเต† เด‡เดฎเต‡เดœเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต gcc เด†เดตเดถเตเดฏเดฎเดพเดฃเต†เดจเตเดจเตเด‚ เดฌเดฟเตฝเดกเต เดธเตเดชเต€เดกเต, เด…เดจเตเดคเดฟเดฎ เด‡เดฎเต‡เดœเต เดตเดฒเตเดชเตเดชเด‚ เดŽเดจเตเดจเดฟเดตเดฏเตเดŸเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดคเตเดคเดฟเตฝ Alpine Linux vs 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 เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเต เด‰เดฌเตเดฃเตเดŸเตเดตเดฟเตฝ เดจเดฟเดจเตเดจเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚:

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/*

เดฎเดฟเด•เดšเตเดš เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เดŽเดดเตเดคเตเดจเตเดจเดคเต เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเดฐเดฟเดงเดฟเด•เตเด•เดชเตเดชเตเดฑเดฎเดพเดฃเต.

เดจเดฎเตเด•เตเด•เต เด…เดธเด‚เดฌเตเดฒเดฟ เดตเต‡เด—เดค เด…เดณเด•เตเด•เดพเด‚:

$ 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) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดชเตˆเดคเตเดคเตบ เด‰เตพเดชเตเดชเต†เดŸเต† เดธเดฟเดฏเดฟเตฝ เดŽเดดเตเดคเดฟเดฏ เดŽเดฒเตเดฒเดพ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดŽเดจเตเดจเดพเตฝ เด†เตฝเดชเตˆเตป `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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•