ΠΠΎΠ»Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄
ΠΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΠ΅ ΠΌΠ΅ΡΡΡΡ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΏΡΠΎ Π½Π΅Π³ΠΎ
Π ΡΠ΅ΠΏΠ΅ΡΡ Π³ΠΎΡΠΎΠ²Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ Π½ΠΎΠ²ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ
, ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π·Π½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΠΏΠ»Π°Π½ΠΎΠ²
ΠΠ»Π°Π½ ΠΈΠ· Π»ΠΎΠ³Π°, Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠΌ
ΠΡΡΠΌΠΎ Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ Π²Π΅ΡΡ Π±Π»ΠΎΠΊ, Π½Π°ΡΠΈΠ½Π°Ρ ΡΠΎ ΡΡΡΠΎΠΊΠΈ Ρ Query Text, ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π»ΠΈΠ΄ΠΈΡΡΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ:
Query Text: INSERT INTO dicquery_20200604 VALUES ($1.*) ON CONFLICT (query)
DO NOTHING;
Insert on dicquery_20200604 (cost=0.00..0.05 rows=1 width=52) (actual time=40.376..40.376 rows=0 loops=1)
Conflict Resolution: NOTHING
Conflict Arbiter Indexes: dicquery_20200604_pkey
Tuples Inserted: 1
Conflicting Tuples: 0
Buffers: shared hit=9 read=1 dirtied=1
-> Result (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)
β¦ ΠΈ Π·Π°ΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΡΠΌΠΎ Π² ΠΏΠΎΠ»Π΅ Π΄Π»Ρ ΠΏΠ»Π°Π½Π°, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΡ:
ΠΠ° Π²ΡΡ
ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π±ΠΎΠ½ΡΡΠΎΠΌ ΠΊ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Π½ΠΎΠΌΡ ΠΏΠ»Π°Π½Ρ Π΅ΡΠ΅ ΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΡ Β«ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΒ», Π³Π΄Π΅ Π½Π°Ρ Π·Π°ΠΏΡΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π²ΠΎ Π²ΡΠ΅ΠΉ ΠΊΡΠ°ΡΠ΅:
JSON ΠΈ YAML
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM pg_class;
"[
{
"Plan": {
"Node Type": "Seq Scan",
"Parallel Aware": false,
"Relation Name": "pg_class",
"Alias": "pg_class",
"Startup Cost": 0.00,
"Total Cost": 1336.20,
"Plan Rows": 13804,
"Plan Width": 539,
"Actual Startup Time": 0.006,
"Actual Total Time": 1.838,
"Actual Rows": 10266,
"Actual Loops": 1,
"Shared Hit Blocks": 646,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning Time": 5.135,
"Triggers": [
],
"Execution Time": 2.389
}
]"
Π₯ΠΎΡΡ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΠΊΠ°Π²ΡΡΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ pgAdmin, Ρ ΠΎΡΡ Π±Π΅Π· β ΠΊΠΈΠ΄Π°Π΅ΠΌ Π² ΡΠΎ ΠΆΠ΅ ΠΏΠΎΠ»Π΅, Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ β ΠΊΡΠ°ΡΠΎΡΠ°:
Π Π°ΡΡΠΈΡΠ΅Π½Π½Π°Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
Planning Time / Execution Time
Π’Π΅ΠΏΠ΅ΡΡ Π»ΡΡΡΠ΅ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΡΠ΄Π° ΡΡΠ»ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠ°:
I/O Timing
ΠΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΠΈΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠ»Π°Π½Π΅ Π²ΡΠΎΠ΄Π΅ ΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² ΡΠΈΡΠ°Π»ΠΎΡΡ-ΠΏΠΈΡΠ°Π»ΠΎΡΡ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ, Π° Π²ΡΠΎΠ΄Π΅ ΠΈ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ.
Π’ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡΡ: "ΠΠΉ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΠΈΡΠΊ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π±ΡΠ» ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΈΡΠ°Π»ΠΎΡΡ ΡΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ!" ΠΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΡΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠΎΡΠ½ΠΎβ¦
ΠΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ΅Π΄ΠΈ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ PG-ΡΠ΅ΡΠ²Π΅ΡΠ° Π΅ΡΡΡ track_io_timing
ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π·Π°ΠΌΠ΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°. ΠΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΡΠΊΠ»ΡΡΡΠ½, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ . ΠΠ»Ρ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ·Π΄Π΅ΡΠΆΠ΅ΠΊ Π·Π°ΠΌΠ΅ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Π°ΡΠ΅ΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠ»ΠΈΡΠΎΠΉ pg_test_timing. Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_database, Π² Π²ΡΠ²ΠΎΠ΄Π΅ EXPLAIN (ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ BUFFERS) ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ pg_stat_statements.
ΠΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ:
SET track_io_timing = TRUE;
ΠΡ, Π° ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΈΡΡΠ½ΠΎΠ΅ β ΠΌΡ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΡΠ΅ΡΠΎΠΌ Π²ΡΠ΅Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΉ Π΄Π΅ΡΠ΅Π²Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
Π’ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΈΠ· 0.790ms Π²ΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ 0.718ms Π·Π°Π½ΡΠ»ΠΎ ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΡ
, 0.044ms β Π·Π°ΠΏΠΈΡΡ Π΅Π΅ ΠΆΠ΅, Π° Π½Π° Π²ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π±ΡΠ»ΠΎ ΠΏΠΎΡΡΠ°ΡΠ΅Π½ΠΎ Π²ΡΠ΅Π³ΠΎ 0.028ms!
ΠΡΠ΄ΡΡΠ΅Π΅ Ρ PostgreSQL 13
ΠΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ ΠΏΠΎΠ»Π½ΡΠΌ ΠΎΠ±Π·ΠΎΡΠΎΠΌ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ
Planning buffers
Π£ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ², Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΡ, Π½Π°ΡΠ΅Π» ΡΠ²ΠΎΠ΅ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΅ΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠ°ΡΡΠ΅, Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΌΡΡΡ ΠΊ pg_stat_statements. EXPLAIN Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ BUFFERS Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±ΡΡΠ΅ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Seq Scan on pg_class (actual rows=386 loops=1) Buffers: shared hit=9 read=4 Planning Time: 0.782 ms Buffers: shared hit=103 read=11 Execution Time: 0.219 ms
ΠΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°
Π ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΊΠ»ΡΡΠ°ΠΌ (k1, k2, k3β¦), ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π·Π½Π°Π½ΠΈΠ΅ΠΌ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΡΠΆΠ΅ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΈΠ· ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, k1 ΠΈ k2). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΎΡΡΠΈΡΠΎΠ²ΡΠ²Π°ΡΡ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π·Π°Π½ΠΎΠ²ΠΎ, Π° ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΈΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π³ΡΡΠΏΠΏΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ k1 ΠΈ k2, ΠΈ βΠ΄ΠΎΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡβ ΠΏΠΎ ΠΊΠ»ΡΡΡ k3.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΡΠΏΠ°Π΄Π°Π΅ΡΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΎΠΊ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. ΠΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π° Π΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ΄Π°Π²Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π²ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ.
Incremental Sort (actual rows=2949857 loops=1) Sort Key: ticket_no, passenger_id Presorted Key: ticket_no Full-sort Groups: 92184 Sort Method: quicksort Memory: avg=31kB peak=31kB -> Index Scan using tickets_pkey on tickets (actual rows=2949857 loops=1) Planning Time: 2.137 ms Execution Time: 2230.019 ms
Π£Π»ΡΡΡΠ΅Π½ΠΈΡ UI/UX
Π‘ΠΊΡΠΈΠ½ΡΠΎΡΡ, ΠΎΠ½ΠΈ Π²Π΅Π·Π΄Π΅!
Π’Π΅ΠΏΠ΅ΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π±ΡΡΡΡΠΎ Π²Π·ΡΡΡ ΡΠΊΡΠΈΠ½ΡΠΎΡ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π° Π²ΡΡ ΡΠΈΡΠΈΠ½Ρ ΠΈ Π³Π»ΡΠ±ΠΈΠ½Ρ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ β Β«ΠΏΡΠΈΡΠ΅Π»Β» ΡΠΏΡΠ°Π²Π°-ΡΠ²Π΅ΡΡ Ρ:
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΊΠ°ΡΡΠΈΠ½ΠΎΠΊ Π΄Π»Ρ ΡΡΠΎΠΉ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ Π½Π° ΡΠ·Π»Π°Ρ
ΠΡ
Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°Π»ΠΎ Π±ΠΎΠ»ΡΡΠ΅, Π½ΠΎ ΠΈ ΠΏΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΌΠΎΠΆΠ½ΠΎ
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· Π°ΡΡ ΠΈΠ²Π°
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π°Π»ΡΡΡ Β«ΡΠΎΠ²ΡΠ΅ΠΌΒ» Π΄Π°ΠΆΠ΅ Π½Π΅ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌΡΠ΅ Π² Π°ΡΡ ΠΈΠ²Π΅ ΠΏΠ»Π°Π½Ρ β ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°ΠΆΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΈΠΊΠΎΠ½ΠΊΡ:
ΠΡ, ΠΈ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com