āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻāĻā§ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻā§ āĻāĻžāĻĄāĻŧāĻž āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāĻ˛ā§ āĻŦāĻž āĻ āĻ¨ā§āĻ¯ āĻāĻŋāĻā§ āĻ āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻ, āĻāĻāĻāĻŋ āĻ¤āĻ¤ā§āĻ¤ā§āĻŦāĻžāĻŦāĻ§āĻžāĻ¨ā§āĻ° āĻāĻžāĻ°āĻŖā§, āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ°ā§āĻāĻ°ā§āĻĄā§āĻ° āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻā§āĻ˛ā§āĻ¨ āĻ āĻ¨ā§āĻ¤āĻ°ā§āĻā§āĻā§āĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻā§āĻ°āĻŽāĻŋāĻ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ° āĻŽāĻžāĻ¨āĻā§āĻ˛āĻŋ āĻāĻāĻāĻŋ āĻāĻĒāĻŋ āĻ¸ā§āĻā§āĻ°āĻŋāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ PostgreSQL āĻ āĻ˛ā§āĻāĻž āĻšāĻ¯āĻŧ, āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻšāĻ āĻžā§ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ
āĻāĻŋāĻ¨ā§āĻ¨ āĻĄā§āĻāĻžāĻ° āĻ
āĻāĻļ āĻāĻŦāĻžāĻ° āĻāĻ¸ā§āĨ¤
āĻ
āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻā§āĻ˛ā§āĻ¨ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ āĻĒāĻ°āĻŋāĻ¤ā§āĻ°āĻžāĻŖ āĻāĻŋāĻāĻžāĻŦā§?
āĻ¯āĻāĻ¨ āĻĒāĻŋāĻā§ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯āĻāĻžāĻ°ā§ āĻ¨āĻ¯āĻŧ
āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻšāĻ āĻāĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻĒā§āĻ°āĻĨāĻŽ āĻ¸ā§āĻĨāĻžāĻ¨ā§ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻĨā§āĻā§ āĻ°āĻā§āĻˇāĻž āĻāĻ°āĻžāĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻā§ āĻ°ā§āĻ˛ āĻāĻ°ā§āĻ¨āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻā§āĻāĻŋāĻ¤ āĻĄā§āĻāĻžāĻ° āĻāĻ˛āĻŋāĻāĻŽ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§ āĻāĻžāĻĄāĻŧāĻž āĻāĻāĻŋ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŽā§āĻāĻŦ āĻ¨āĻ¯āĻŧāĨ¤
āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ¯āĻĻāĻŋ āĻā§āĻ¸ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§āĻ° āĻ¨āĻŋāĻ°ā§āĻā§āĻ˛āĻ¤āĻž āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻ¨āĻŋāĻ°ā§āĻā§āĻ˛āĻ¤āĻžāĻ° āĻā§āĻ¯āĻŧā§ āĻŦā§āĻļāĻŋ āĻšāĻ¯āĻŧ:
metric | ts | data
--------------------------------------------------
cpu.busy | 2019-12-20 00:00:00 | {"value" : 12.34}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 10}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 11.2}
cpu.busy | 2019-12-20 00:00:03 | {"value" : 15.7}
āĻāĻĒāĻ¨āĻŋ āĻāĻŋ āĻ˛āĻā§āĻˇā§āĻ¯ āĻāĻ°ā§āĻāĻŋāĻ˛ā§āĻ¨? 00:00:02 āĻāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§ āĻāĻžāĻāĻ¨ā§āĻāĻĄāĻžāĻāĻ¨āĻāĻŋ āĻāĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻāĻā§ ts āĻ¸āĻš āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ°ā§āĻāĻ°ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻā§āĻ° āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§ āĻāĻāĻŋ āĻŦā§āĻļ āĻŦā§āĻ§ āĻāĻŋāĻ˛ (āĻ¸āĻ°ā§āĻŦāĻļā§āĻˇā§, āĻĄā§āĻāĻž āĻŽāĻžāĻ¨āĻā§āĻ˛āĻŋ āĻāĻ˛āĻžāĻĻāĻž!)
āĻ āĻŦāĻļā§āĻ¯āĻ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ PK(āĻŽā§āĻā§āĻ°āĻŋāĻ, ts) - āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻŽāĻ°āĻž āĻŦā§āĻ§ āĻĄā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻĻā§āĻŦāĻ¨ā§āĻĻā§āĻŦ āĻĒāĻžāĻŦāĨ¤
āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ PK(āĻŽā§āĻā§āĻ°āĻŋāĻ, ts, āĻĄā§āĻāĻž) - āĻ¤āĻŦā§ āĻāĻāĻŋ āĻāĻ° āĻāĻ˛āĻŋāĻāĻŽāĻā§ āĻŦā§āĻ¯āĻžāĻĒāĻāĻāĻžāĻŦā§ āĻŦā§āĻĻā§āĻ§āĻŋ āĻāĻ°āĻŦā§, āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦ āĻ¨āĻžāĨ¤
āĻ āĻ¤āĻāĻŦ, āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻ āĻŋāĻ āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻšāĻ˛ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻ -āĻ āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§āĻāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž (āĻŽā§āĻā§āĻ°āĻŋāĻ, āĻāĻŋāĻāĻ¸) āĻāĻŦāĻ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻ¤āĻžāĻ° āĻĒāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĻā§āĻāĻž āĻĻāĻŋāĻ˛ā§ āĻŽā§āĻāĻžāĻŦā§āĻ˛āĻž āĻāĻ°ā§āĻ¨āĨ¤
"āĻā§āĻ˛ā§āĻ¨āĻŋāĻ āĻ¯ā§āĻĻā§āĻ§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧā§āĻā§"
āĻāĻŋāĻā§ āĻ§āĻ°āĻŖā§āĻ° āĻĻā§āĻ°ā§āĻāĻāĻ¨āĻž āĻāĻā§āĻā§, āĻāĻŦāĻ āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻŦāĻŋāĻ˛ āĻĨā§āĻā§ āĻā§āĻ˛ā§āĻ¨ āĻ°ā§āĻāĻ°ā§āĻĄāĻā§āĻ˛āĻŋ āĻ§ā§āĻŦāĻāĻ¸ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻāĻ¸āĻ˛ āĻĄā§āĻāĻž āĻŽāĻĄā§āĻ˛ āĻāĻ°āĻž āĻ¯āĻžāĻ:
CREATE TABLE tbl(k text, v integer);
INSERT INTO tbl
VALUES
('a', 1)
, ('a', 3)
, ('b', 2)
, ('b', 2) -- oops!
, ('c', 3)
, ('c', 3) -- oops!!
, ('c', 3) -- oops!!
, ('d', 4)
, ('e', 5)
;
āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻšāĻžāĻ¤ āĻ¤āĻŋāĻ¨āĻŦāĻžāĻ° āĻāĻžāĻāĻĒāĻā§, Ctrl+V āĻāĻāĻā§ āĻā§āĻā§, āĻāĻŦāĻ āĻāĻāĻ¨...
āĻĒā§āĻ°āĻĨāĻŽā§, āĻāĻ¸ā§āĻ¨ āĻāĻŽāĻ°āĻž āĻŦā§āĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻŦāĻŋāĻ˛āĻāĻŋ āĻ āĻ¨ā§āĻ āĻŦāĻĄāĻŧ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¤āĻžāĻ āĻāĻŽāĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻā§āĻ˛ā§āĻ¨ āĻā§āĻāĻā§ āĻĒāĻžāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§, āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻā§āĻˇāĻ°āĻŋāĻ āĻ āĻ°ā§āĻĨā§ "āĻāĻā§āĻ˛ āĻā§āĻāĻāĻž" āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¤āĻžāĻĻā§āĻ° āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻžāĻĄāĻŧāĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ°ā§āĻāĻ°ā§āĻĄ.
āĻāĻŦāĻ āĻ¯ā§āĻŽāĻ¨ āĻāĻāĻāĻŋ āĻāĻĒāĻžāĻ¯āĻŧ āĻāĻā§ - āĻāĻ
āĻ āĻ°ā§āĻĨāĻžā§, āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻ¸āĻžāĻ°āĻŋāĻ° āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻĒā§āĻ°āĻ¸āĻā§āĻā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻ°ā§āĻāĻ°ā§āĻĄā§āĻ° ctid āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ¸āĻšāĻ āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻšāĻ˛ āĻĒā§āĻ°ā§ āĻ˛āĻžāĻāĻ¨āĻāĻŋāĻā§ āĻĒāĻžāĻ ā§āĻ¯ā§ āĻ¨āĻŋāĻā§āĻˇā§āĻĒ āĻāĻ°āĻž:
SELECT
T::text
, array_agg(ctid) ctids
FROM
tbl T
GROUP BY
1;
t | ctids
---------------------------------
(e,5) | {"(0,9)"}
(d,4) | {"(0,8)"}
(c,3) | {"(0,5)","(0,6)","(0,7)"}
(b,2) | {"(0,3)","(0,4)"}
(a,3) | {"(0,2)"}
(a,1) | {"(0,1)"}
āĻāĻāĻž āĻāĻŋ āĻāĻžāĻ¸ā§āĻ āĻāĻ°āĻž āĻ¸āĻŽā§āĻāĻŦ āĻ¨āĻž?āĻ¨ā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻāĻŋ āĻŦā§āĻļāĻŋāĻ°āĻāĻžāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ āĻ¸āĻŽā§āĻāĻŦāĨ¤ āĻ¯āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻāĻĒāĻ¨āĻŋ āĻāĻ āĻā§āĻŦāĻŋāĻ˛ā§ āĻā§āĻˇā§āĻ¤ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻļā§āĻ°ā§ āĻāĻ°ā§āĻ¨ āĻ¸āĻŽāĻ¤āĻž āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻāĻžāĻĄāĻŧāĻž āĻĒā§āĻ°āĻāĻžāĻ°:
CREATE TABLE tbl(k text, v integer, x point);
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T;
-- ERROR: could not identify an equality operator for type tbl
āĻšā§āĻ¯āĻžāĻ, āĻāĻŽāĻ°āĻž āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻ āĻ¯ā§ āĻ¯āĻĻāĻŋ āĻ ā§āĻ¯āĻžāĻ°ā§āĻ¤ā§ āĻāĻāĻžāĻ§āĻŋāĻ āĻāĻ¨ā§āĻā§āĻ°āĻŋ āĻĨāĻžāĻā§ āĻ¤āĻŦā§ āĻāĻā§āĻ˛āĻŋ āĻ¸āĻŦ āĻā§āĻ˛ā§āĻ¨āĨ¤ āĻāĻ¸ā§āĻ¨ āĻļā§āĻ§ā§ āĻ¤āĻžāĻĻā§āĻ° āĻā§āĻĄāĻŧā§ āĻĻāĻŋāĻ¨:
SELECT
unnest(ctids[2:])
FROM
(
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T::text
) T;
unnest
------
(0,6)
(0,7)
(0,4)
āĻ¯āĻžāĻ°āĻž āĻā§āĻ āĻāĻ°ā§ āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻāĻ¨ā§āĻĻ āĻāĻ°ā§āĻ¨ āĻ¤āĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋ āĻāĻ āĻŽāĻ¤ āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
SELECT
unnest((array_agg(ctid))[2:])
FROM
tbl T
GROUP BY
T::text;
āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻāĻāĻĄ āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻāĻ° āĻŽāĻžāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻ āĻāĻŽāĻ°āĻž āĻ¸āĻžāĻŦāĻā§āĻ¯āĻŧā§āĻ°āĻŋāĻ° āĻ°āĻŋāĻāĻžāĻ°ā§āĻ¨ āĻāĻ°āĻž āĻāĻ˛āĻžāĻŽ āĻĨā§āĻā§ āĻāĻāĻŋāĻā§ āĻĢā§āĻ˛ā§ āĻĻāĻŋāĻ¯āĻŧā§āĻāĻŋāĨ¤
āĻāĻ° āĻāĻŋāĻā§ āĻāĻ°āĻžāĻ° āĻŦāĻžāĻāĻŋ āĻāĻā§ - āĻāĻŽāĻ°āĻž āĻ¯ā§ āĻ¸ā§āĻāĻāĻŋ āĻĒā§āĻ¯āĻŧā§āĻāĻŋ āĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ DELETE āĻāĻ°ā§āĻ¨:
DELETE FROM
tbl
WHERE
ctid = ANY(ARRAY(
SELECT
unnest(ctids[2:])
FROM
(
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T::text
) T
)::tid[]);
āĻāĻ¸ā§āĻ¨ āĻ¨āĻŋāĻā§āĻĻā§āĻ° āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž āĻ¯āĻžāĻ:
āĻšā§āĻ¯āĻžāĻ, āĻ¸āĻŦāĻāĻŋāĻā§āĻ āĻ¸āĻ āĻŋāĻ: āĻāĻŽāĻžāĻĻā§āĻ° 3āĻāĻŋ āĻ°ā§āĻāĻ°ā§āĻĄ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻāĻāĻŽāĻžāĻ¤ā§āĻ° Seq āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ āĻāĻŦāĻ āĻĄā§āĻāĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻĄāĻŋāĻ˛āĻŋāĻ āĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ āĻāĻŋāĻĄ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻš āĻāĻāĻ āĻĒāĻžāĻ¸:
-> Tid Scan on tbl (actual time=0.050..0.051 rows=3 loops=1)
TID Cond: (ctid = ANY ($0))
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ
āĻ¨ā§āĻ āĻ°ā§āĻāĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻāĻ°ā§āĻ¨,
āĻāĻ¸ā§āĻ¨ āĻāĻāĻāĻŋ āĻŦā§āĻšāĻ¤ā§āĻ¤āĻ° āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŦā§āĻšāĻ¤ā§āĻ¤āĻ° āĻ¸āĻāĻā§āĻ¯āĻ āĻ¸āĻĻā§āĻļ āĻ¸āĻš āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻŋ:
TRUNCATE TABLE tbl;
INSERT INTO tbl
SELECT
chr(ascii('a'::text) + (random() * 26)::integer) k -- a..z
, (random() * 100)::integer v -- 0..99
FROM
generate_series(1, 10000) i;
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻ¸āĻĢāĻ˛āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°ā§, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻ
āĻŦāĻļā§āĻ¯āĻ āĻāĻŋāĻā§ āĻ¸āĻ¤āĻ°ā§āĻāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻāĻŋāĻ¤āĨ¤ āĻāĻžāĻ°āĻŖ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻ°ā§āĻāĻ°ā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŋāĻĄ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§ āĻāĻāĻāĻŋ āĻĄā§āĻāĻž āĻĒā§āĻˇā§āĻ āĻž āĻĒāĻĄāĻŧāĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com