"Epic เปƒเบซเบกเปˆ". เบžเบงเบเป€เบฎเบปเบฒเบเบดเบ™เบŠเป‰เบฒเบ‡เป€เบ›เบฑเบ™เบชเปˆเบงเบ™

"Epic เปƒเบซเบกเปˆ". เบžเบงเบเป€เบฎเบปเบฒเบเบดเบ™เบŠเป‰เบฒเบ‡เป€เบ›เบฑเบ™เบชเปˆเบงเบ™

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบเปเบฒเบ™เบปเบ”เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบเบก "Epics", เปเบฅเบฐเบเบฑเบ‡เบˆเบฐเบ—เปเบฒเบฅเบฒเบเป€เบเบกเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ OpenFaaS. เบ‚เป‰เบญเบเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ Linux, เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰ Kubernetes เปƒเบ™ minikube เป‚เบ”เบเปƒเบŠเป‰ VirtualBox. เป€เบ„เบทเปˆเบญเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบกเบต 2 เปเบเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เปเบฅเบฐ 12GB เบ‚เบญเบ‡ RAM; เบ‚เป‰เบญเบเปƒเบŠเป‰ SSD เป€เบ›เบฑเบ™เปเบœเปˆเบ™เบฅเบฐเบšเบปเบš. เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰ debian 8 เป€เบ›เบฑเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบกเบตเปเบžเบฑเบเป€เบเบฑเบ” emacs, sudo, git เปเบฅเบฐ virtualbox เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เบˆเบฐเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเบเบฒเบ™เบ”เบฒเบงเป‚เบซเบฅเบ”เบˆเบฒเบ GitHub เปเบฅเบฐเปเบซเบผเปˆเบ‡เบญเบทเปˆเบ™เป†. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเบนเปˆเปƒเบ™ /usr/local/bin เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆเป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เป€เบ›เบฑเบ™เบขเปˆเบฒเบ‡เบญเบทเปˆเบ™. เบกเบฒเป€เบฅเบตเปˆเบกเบเบฑเบ™เป€เบฅเบตเบ!

เบเบฒเบ™เบเบฐเบเบฝเบกเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ

เบเบณเบฅเบฑเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Go

เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบฒเบ‡เบเบฒเบ™:

$ curl -L0 https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz -o go.tar.gz
$ sudo tar -C /usr/local -xzf go.tar.gz
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile

เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‡เบฒเบ™โ€‹:

$ mkdir -p ~/go/src/hello && cd ~/go/src/hello
$ echo 'package main

import "fmt"

func main() {
fmt.Printf("hello, worldn")
}' > hello.go
$ go build
$ ./hello
hello, world

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ faas-cli

เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบฒเบ‡เบเบฒเบ™:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Downloading package https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli as /tmp/faas-cli
Download complete.

Running with sufficient permissions to attempt to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 version: 0.11.3

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เปƒเบŠเป‰ bash-completion:

faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ เปเบฅเบฐเบเบณเบ™เบปเบ”เบ„เปˆเบฒ Kubernetes

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, minikube เปเบกเปˆเบ™เบžเบฝเบ‡เบžเป, เบชเบฐเบ™เบฑเป‰เบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เปเบฅเบฐ kubelet เปƒเบ™ /usr/local/bin, เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ helm เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

$ curl https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -o minikube && chmod +x minikube && sudo mv minikube /usr/local/bin/
$ curl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -o kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
$ curl https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/bin

เป€เบ›เบตเบ”เบ•เบปเบง minikube:

$ minikube start
  minikube v1.6.2 on Debian 8.11
  Automatically selected the 'virtualbox' driver (alternates: [])
  Downloading VM boot image ...
    > minikube-v1.6.0.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s
    > minikube-v1.6.0.iso: 150.93 MiB / 150.93 MiB [-] 100.00% 5.67 MiB p/s 27s
  Creating virtualbox VM (CPUs=2, Memory=8192MB, Disk=20000MB) ...
  Preparing Kubernetes v1.17.0 on Docker '19.03.5' ...
  Downloading kubeadm v1.17.0
  Downloading kubelet v1.17.0
  Pulling images ...
  Launching Kubernetes ...  Waiting for cluster to come online ...
  Done! kubectl is now configured to use "minikube"

เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡:

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-knlcb           1/1     Running   0          29m
kube-system   coredns-6955765f44-t9cpn           1/1     Running   0          29m
kube-system   etcd-minikube                      1/1     Running   0          28m
kube-system   kube-addon-manager-minikube        1/1     Running   0          28m
kube-system   kube-apiserver-minikube            1/1     Running   0          28m
kube-system   kube-controller-manager-minikube   1/1     Running   0          28m
kube-system   kube-proxy-hv2wc                   1/1     Running   0          29m
kube-system   kube-scheduler-minikube            1/1     Running   0          28m
kube-system   storage-provisioner                1/1     Running   1          29m

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ OpenFaaS

เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบชเป‰เบฒเบ‡ 2 namespaces เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš:

$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created

เป€เบžเบตเปˆเบกเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบชเบณเบฅเบฑเบšเปเบงเบ:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบเปˆเบญเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡, เปƒเบซเป‰เปƒเบŠเป‰เบกเบฑเบ™เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบฅเบฑเบš k8s:

$ PASSWORD=verysecurerandompasswordstring
$ kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
secret/basic-auth created

เบกเบฒเบ™เบณเปƒเบŠเป‰:

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
Update Complete.  Happy Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: Fri Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:

  kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"

เบซเบผเบฑเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเปƒเบ”เบซเบ™เบถเปˆเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบชเบฐเป€เบซเบ™เบต:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
alertmanager        1/1     1            1           114s
basic-auth-plugin   1/1     1            1           114s
faas-idler          1/1     1            1           114s
gateway             1/1     1            1           114s
nats                1/1     1            1           114s
prometheus          1/1     1            1           114s
queue-worker        1/1     1            1           114s

เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เบ—เปเบฒโ€‹เบ‡เบฒเบ™โ€‹:

$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" successfully rolled out
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Forwarding from 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Calling the OpenFaaS server to validate the credentials...
Handling connection for 8080
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
credentials saved for admin http://127.0.0.1:8080
$ faas-cli list
Function                        Invocations     Replicas

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Mongodb

เบžเบงเบเป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰เบซเบกเบงเบเบเบฑเบ™เบเบฐเบ—เบปเบš:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LAST DEPLOYED: Fri Dec 25 11:15:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **

MongoDB can be accessed via port 27017 on the following DNS name from within your cluster:

    mongodb-1577466908.default.svc.cluster.local

To get the root password run:

    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)

To connect to your database run the following command:

    kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
    mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡:

kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
If you don't see a command prompt, try pressing enter.

> db.version();
4.0.14

เบเบปเบ” ctrl+D เป€เบžเบทเปˆเบญเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡เบšเบฑเบ™เบˆเบธ.

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ emacs

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป„เบ”เป‰เบ–เบทเบ configured เปเบฅเป‰เบงเบ•เบฒเบก เบšเบปเบ”เบ‚เบฝเบ™เบ™เบตเป‰, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

เบ—เปเบฒเบฅเบฒเบเป€เบเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ

เบ›เบฐเบ•เบดเบชเปเบฒเบžเบฑเบ™เบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบ•เปˆเบฒเบ‡เป†เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ”เบเบœเปˆเบฒเบ™ http protocol, เบเบฒเบ™เบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™เปเบšเบš end-to-end เบฅเบฐเบซเบงเปˆเบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เปˆเบฒเบ‡เป†เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบ JWT. Mongodb เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ tokens, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเป€เบเบก, เบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เบ™, เบฅเปเบฒเบ”เบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡เป€เบเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†. เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบšเบดเปˆเบ‡เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”.

เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™

เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™ JSON เบเบฑเบšเบŠเบทเปˆเบซเบผเบดเป‰เบ™เป€เบเบก เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™. เป€เบกเบทเปˆเบญเบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบ–เบทเบเป€เบญเบตเป‰เบ™, เบกเบฑเบ™เบ–เบทเบเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ alias เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™; เบ–เป‰เบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, alias เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ hash เบˆเบฐเบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบขเปˆเบฒเบ‡เบˆเบดเบ‡เบˆเบฑเบ‡เปƒเบ™เป€เบเบก.

entry

เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™ JSON เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบซเบผเบดเป‰เบ™เป€เบเบก เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™; เบ–เป‰เบฒเบกเบตเบŠเบทเปˆเบซเบผเบดเป‰เบ™เบขเบนเปˆเปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ–เบทเบเบขเบทเบ™เบขเบฑเบ™เบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™เบเบฑเบšเบญเบฑเบ™เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบเปˆเบญเบ™เปœเป‰เบฒเบ™เบตเป‰, JWT เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบ•เปเปˆเบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบญเบทเปˆเบ™เป€เบกเบทเปˆเบญเบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆ. เป€เบญเบตเป‰เบ™เบงเปˆเบฒ. เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เปˆเบฒเบ‡เป†เบเบฑเบ‡เบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบงเบฅเบฒเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบซเบผเป‰เบฒเบชเบธเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบŠเบทเปˆเป€เบเบก

เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เปƒเบซเป‰โ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เป€เบเบกโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบเบปเบโ€‹เป€เบงเบฑเป‰เบ™โ€‹เป€เบเบกโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹. เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบเบฑเบ‡เป€เบซเบฑเบ™เบฅเบฒเบเบŠเบทเปˆเป€เบเบกเบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบขเบนเปˆ. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™ JSON เบ—เบตเปˆเบกเบตเบฅเบฒเบเบŠเบทเปˆเป€เบเบก (ID เป€เบเบก, เบŠเบทเปˆเบ—เบตเปˆเบกเบฐเบ™เบธเบ”เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰, เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เบเบฒเบ™เบชเป‰เบฒเบ‡เป€เบเบก

เบŸเบฑเบ‡เบŠเบฑเบ™เปƒเบŠเป‰เป„เบ”เป‰เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™; เบˆเปเบฒเบ™เบงเบ™เบœเบนเป‰เบซเบผเบดเป‰เบ™เบชเบนเบ‡เบชเบธเบ”เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบšเปƒเบ™เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบเบก (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบ”เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™เป€เบเบกเบ™เบตเป‰, เบˆเปเบฒเบ™เบงเบ™เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบœเบนเป‰เบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†). เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบญเบ‡เป€เบเบกเปเบกเปˆเบ™เบเบฒเบ™เบกเบตเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เป€เบเบกเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เป€เบเบกเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™ JSON, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ„เบงเบฒเบกเบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡, เบ•เบปเบงเบฅเบฐเบšเบธเป€เบเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบญเบทเปˆเบ™เป†.

เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป€เบเบก

เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™ ID เป€เบเบกเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เบ–เป‰เบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบเบกเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ, เบœเบปเบ™เบœเบฐเบฅเบดเบ”เปเบกเปˆเบ™ JSON เบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป€เบเบก. เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบ—เบตเปˆโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เป€เบเบกโ€‹, เป€เบŠเบฑเปˆเบ™โ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบเบฑเบšโ€‹เบœเบนเป‰โ€‹เบชเป‰เบฒเบ‡โ€‹เบ‚เบญเบ‡โ€‹เป€เบเบกโ€‹, เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เป€เบญเบตเป‰เบ™โ€‹เบงเปˆเบฒโ€‹เบœเบนเป‰โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เป€เบเบกโ€‹.

เป€เบšเบดเปˆเบ‡เป€เบซเบ”เบเบฒเบ™เป€เบเบก

เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบดเบ”โ€‹เบˆเบฐโ€‹เบเปเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป€เบเบกโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹, เปเบฅเบฐโ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบดเบ”โ€‹เบˆเบฐโ€‹เบเปเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป€เบเบกโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹. เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ•เปเปˆเบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเป€เบฅเบเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบฝเบ‡เปเบ•เปˆเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบžเบฒเบเบซเบฅเบฑเบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ. เป‚เบ”เบเบเบฒเบ™เป€เบ›เบตเบ”เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เป€เบ›เบฑเบ™เป„เบฅเบเบฐเป†, เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป€เบเบก. เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบเบฑเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบŠเบดเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เป€เบซเบ”เบเบฒเบ™เบ‚เบญเบ‡เป€เบเบก.

เบชเบปเปˆเบ‡เป€เบซเบ”เบเบฒเบ™เป€เบเบก

เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป€เบเบก: เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบเบก, เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบฅเบปเบ‡เบ„เบฐเปเบ™เบ™เบชเบฝเบ‡, เบ‚เบฝเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบดเบ”เบˆเบฐเบเปเบฒเป€เบเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เป€เบเบกเป€เบฅเบตเปˆเบกเปเบˆเบเบขเบฒเบเบšเบปเบ”เบšเบฒเบ”เปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เป€เบเบก, เบฅเบงเบกเบ—เบฑเบ‡เบ•เบปเบงเป€เบญเบ‡, เบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เบขเบทเบ™เบขเบฑเบ™เบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป‚เบ”เบเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ”เบฝเบงเบเบฑเบ™. เป€เบกเบทเปˆเบญเบšเบปเบ”เบšเบฒเบ”เบ—เบฑเบ‡เปเบปเบ”เบ–เบทเบเบขเบทเบ™เบขเบฑเบ™เปเบฅเป‰เบง, เป€เบเบกเบˆเบฐเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เป‚เปเบ”เบเบฒเบ‡เบ„เบทเบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เบชเบฐเบ–เบดเบ•เบดเป€เบเบก

เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป€เบเบก; เบกเบฑเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เป€เบเบก, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบœเบนเป‰เบ™ (nicknames), เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เปเบฅเบฐเบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ (เบเป‰เบฒเบเบญเบญเบเบซเบผเบทเบšเปเปˆ), เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†. เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเป€เบเบก.

เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบตเบ”เบ•เบปเบงเป€เบ›เบฑเบ™เป„เบฅเบเบฐ

เบ–เป‰เบฒเป€เบเบกเบšเปเปˆเป„เบ”เป‰เป€เบ›เบตเบ”เบ•เบปเบงเป€เบ›เบฑเบ™เบšเบฒเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เป€เบงเบฅเบฒเบชเป‰เบฒเบ‡เป€เบเบก, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบฅเบถเบšเบญเบญเบเบˆเบฒเบเบฅเบฒเบเบŠเบทเปˆเป€เบเบกเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™.

เบงเบฝเบเบ›เบฐเบˆเบณเป„เบฅเบเบฐเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เปเบกเปˆเบ™เบเบฒเบ™เบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบ›เปˆเบฝเบ™เป‚เปเบ”เป€เบเบกเบˆเบฒเบเบเบฒเบ‡เบ„เบทเบ™เป„เบ›เบซเบฒเบเบฒเบ‡เป€เบงเบฑเบ™ เปเบฅเบฐเบเบฑเบšเบ„เบทเบ™เบชเบณเบฅเบฑเบšเป€เบเบกเบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเป€เบ›เบตเบ” (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบœเบนเป‰เบซเบผเบดเป‰เบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบญเบšเบชเบฐเปœเบญเบ‡เบ•เปเปˆเป€เบซเบ”เบเบฒเบ™เป€เบเบกเบšเปเปˆเป„เบ”เป‰เบชเบปเปˆเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบซเป‰เบฅเบฒเบงเบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡. ).

เปเบˆเป‰เบ‡เบเบฒเบ™

  • เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต
  • เบงเบฒเบ‡โ€‹เบญเบญเบโ€‹เบชเบฐเบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบกโ€‹เปเบซเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”เบ—เบฐเบ™เบฒ, โ€‹เปเบšเปˆเบ‡โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบญเบญเบโ€‹เป€เบ›เบฑเบ™โ€‹เปœเป‰เบฒโ€‹เบ—เบตเปˆ
  • เบงเบฝเบเบ”เป‰เบฒเบ™เบซเบผเบฑเบ‡
  • เปœเป‰เบฒเบงเบฝเบ
  • เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ CICDโ€‹, เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹
  • เป€เบฅเบตเปˆเบกเบŠเปˆเบงเบ‡เบ—เบปเบ”เบฅเบญเบ‡เป€เบเบก
  • เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™