Π Π°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ IoT Inspector ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° Π²Π΅ΡΠ΅ΠΉ
Π ΠΊΠΎΠ½ΡΠ°Π»ΡΠΈΠ½Π³ΠΎΠ²ΠΎΠΉ ΡΠΈΡΠΌΠ΅ Bain & Company (
ΠΠΎ
Π§ΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ ΡΠΌΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΈ ΠΠ’-ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΈ Π²ΡΠ·ΠΎΠ² ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ°
IoT Inspector ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ IoT-Π΄Π΅Π²Π°ΠΉΡΠΎΠ² Π² ΡΠ΅ΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ
ΠΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ARP-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
class ArpScan(object):
def __init__(self, host_state):
assert isinstance(host_state, HostState)
self._lock = threading.Lock()
self._active = True
self._thread = threading.Thread(target=self._arp_scan_thread)
self._thread.daemon = True
def start(self):
with self._lock:
self._active = True
utils.log('[ARP Scanning] Starting.')
self._thread.start()
def _arp_scan_thread(self):
utils.restart_upon_crash(self._arp_scan_thread_helper)
def _arp_scan_thread_helper(self):
while True:
for ip in utils.get_network_ip_range():
time.sleep(0.05)
arp_pkt = sc.Ether(dst="ff:ff:ff:ff:ff:ff") /
sc.ARP(pdst=ip, hwdst="ff:ff:ff:ff:ff:ff")
sc.sendp(arp_pkt, verbose=0)
with self._lock:
if not self._active:
return
def stop(self):
utils.log('[ARP Scanning] Stopping.')
with self._lock:
self._active = False
self._thread.join()
utils.log('[ARP Scanning] Stopped.')
ΠΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π² ΡΠ΅ΡΡ, ΡΠ΅ΡΠ²Π΅Ρ IoT Inspector ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ, Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΡΠ°ΠΉΡΠ°ΠΌΠΈ IoT-Π³Π°Π΄ΠΆΠ΅ΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅ΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ ΠΎΠ±ΡΡΠΌΠ°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π²ΡΡΠ²ΠΈΡΡ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΡΡΡΠ»Π°ΡΡΡΡ ΠΠ Π±Π΅Π· Π²Π΅Π΄ΠΎΠΌΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠΎΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ macOS. Π‘ΠΊΠ°ΡΠ°ΡΡ zip-Π°ΡΡ
ΠΈΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°
Π ΡΡΠΎΠΌ Π³ΠΎΠ΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠ±Π΅ΡΠ°Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π΅ΡΡΠΈΡ Π΄Π»Ρ Linux, Π° Π² ΠΌΠ°Π΅ β ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ Windows. ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ΡΡΡ
ΠΠΎΡΠ΅Π½ΡΠΈΠ°Π» ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΠ’-ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠΌ ΠΈΡΠΊΠ°ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠΈ IoT-Π΄Π΅Π²Π°ΠΉΡΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΡΠΌΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π£ΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ.
IoT Inspector Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. Π’Π°ΠΊΠΆΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ ΡΠΌΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΌΠ΅Π΄Π»ΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎ ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
Π£ IoT Inspector ΠΏΠΎΠΊΠ° Π΅ΡΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ΅, Π΅Π³ΠΎ Π΅ΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π½Π° Π²ΡΠ΅Ρ IoT-ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠ΅ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΌΠ½ΡΡ Π³Π°Π΄ΠΆΠ΅ΡΠΎΠ². ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ Π°Π²ΡΠΎΡΡ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΌΠ΅Π΄ΠΈΡΠΈΠ½ΡΠΊΠΈΠΌ Π³Π°Π΄ΠΆΠ΅ΡΠ°ΠΌ.
Π‘Π΅ΠΉΡΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΡΠΎΠΊΡΡΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ Π½Π° ΡΡΡΡΠ°Π½Π΅Π½ΠΈΠΈ Π±Π°Π³ΠΎΠ², Π½ΠΎ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΡΠΈΠ½ΡΡΠΎΠ½ΡΠΊΠΎΠ³ΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ° ΠΏΠ»Π°Π½ΠΈΡΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π²Π½Π΅Π΄ΡΠΈΡΡ Π² Π½Π΅Π³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ. ΠΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³ΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ DDoS-Π°ΡΠ°ΠΊ Π΄ΠΎ 99%. ΠΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΈΠ΄Π΅ΡΠΌΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²
ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ Π² ΡΡΠ΅ΡΠ΅ IoT
ΠΡΡΠΏΠΏΠ° Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈΡ
ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ°Π΅Ρ Ρ ΠΡΠ½Π½ΠΈ ΠΡΠ΄ΠΌΠ°Π½ΠΎΠΌ (Danny Goodman), Π°Π²ΡΠΎΡΠΎΠΌ ΠΊΠ½ΠΈΠ³ ΠΏΠΎ JavaScript ΠΈ HTML, ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° Π²Π΅ΡΠ΅ΠΉ β
Π¦Π΅Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° β ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ IoT-Π³Π°Π΄ΠΆΠ΅ΡΡ ΡΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ° Π² Π΅Π΄ΠΈΠ½ΡΡ ΡΠ΅ΡΡ ΠΈ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠ°ΡΡΠΎ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°Π·ΡΠΎΠ·Π½Π΅Π½Π½ΠΎ. Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π°Π²ΡΠΎΡΡ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΠ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌΠΈ, Π³Π°Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
Π΄Π΅Π²Π°ΠΉΡΠΎΠ²
ΠΡΡΠ³ΠΎΠΉ ΠΎΡΠΊΡΡΡΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ β
/ ΡΠΎΡΠΎ
ΠΡΠ΄ΡΡΠ΅Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ
ΠΠ° IoT-ΡΡΠ½ΠΊΠ΅ Π²ΡΠ΅ ΡΠ°ΡΠ΅ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΠΎΠΏΠ΅Π½ΡΠΎΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ. Π Linux Foundation, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΡΠ΅ΡΠ΅ IoT (ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠΎΡΡΡ ΠΈΠ· ΠΠ΅ΡΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠ³Π° ΠΎ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠΌ IaaS:
ΠΠ°ΠΊ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ REDWEB ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ Β«ΠΠ’-ΠΠ ΠΠΒ» Π Π°Π·Π²ΠΈΡΠΈΠ΅ Π΄Π°ΡΠ°-ΡΠ΅Π½ΡΡΠΎΠ²: ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ΅Π½Π΄Ρ Avito.ru: ΠΊΠ°ΠΊ ΠΎΠ±Π»Π°ΠΊΠΎ IaaS ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π² ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΈΠ·Π½Π΅ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΠ°ΠΊ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΡΠ½Π΅ΡΠ³ΠΎΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π΄Π°ΡΠ°-ΡΠ΅Π½ΡΡΠ° ΠΠΈΡ Π΄ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅. ΠΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ ΠΆΠΈΠ·Π½Ρ Ρ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ DNS Flag Day ΠΠΎΡΠ»Π΅Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΡΠ»ΡΠ³Π°: ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΠ°ΠΊ IaaS ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ Π±ΠΈΠ·Π½Π΅Ρ: ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠΈΡ ΠΎΠ±Π»Π°ΠΊΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com