рдПрдЪрдЯреАрдПрдордПрд▓ 5 рд╕рд░реНрдХреБрд▓рд░ рдкреИрдиреЛрд░рдорд╛ рддреАрди.рдЬреЗрдПрд╕ рдкрд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рдЪрд┐рддреНрд░рдорд╛рд▓рд╛ рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкрдиреАрд░ рдШрд░ рд▓реЗ рд▓реЛред рдпрд╣ рд╢рд╛рдирджрд╛рд░ рдЫреЛрдЯреА рдЪреАрдЬ рдЬрд▓реНрдж рд╣реА рд░реЗрд╕реНрддрд░рд╛рдВ, рд╣реЛрдЯрд▓, рд╣реЛрдЯрд▓ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЖрдо рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдлреНрд▓реИрд╢ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬреЛ рдЖрдИрдЯреА рд╡рд┐рднрд╛рдЧ рдХреА рдХрдбрд╝реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдХреЗ рдХрд╛рд░рдг рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рдЖрдИ рд╣реИред
рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдЬреЛ рдореБрдЭреЗ WebGL + THREE.js рдкрд░ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкреИрдиреЛрд░рдорд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрдИ рдереАрдВред


рдкреИрдиреЛрд░рдорд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ: тАЬрд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рддрд╣ рдкрд░ рдПрдХ рдкреИрдиреЛрд░рдорд╛ рдмрдирд╛рд╡рдЯ рд▓рд╛рдЧреВ рд╣реИред рд╣рдо рдПрдХ рдРрд╕рд╛ рдХреИрдорд░рд╛ рд╣реИ, рдЬреЛ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдореБрдбрд╝рдХрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред "рдЧреЛрд▓реЗ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рддрд╣ (" рдкрд╛рд╕ "рд╕рддрд╣, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛) рдореЗрдВ рддрддреНрд╡ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рдЙрди рдкрд░ рдордВрдбрд░рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд┐рдбрд╝рдХреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред"

рдХрдВрдкрдиреА рдХрд╛ рдЙрддреНрдкрд╛рджрди


рдкреИрдиреЛрд░рдорд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдШрди рдФрд░ рдЧреЛрд▓рд╛рдХрд╛рд░ред рдореИрдВрдиреЗ рдЧреЛрд▓рд╛рдХрд╛рд░ рдХреЛ рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рджреГрд╖реНрдЯрд┐рдЧрдд рд╕рдорд╛рди рд╕рдХреНрд░рд┐рдп рддрддреНрд╡реЛрдВ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рд╕реЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдПрдХ рд╕рдорд╛рди рджреВрд░реА рддрдп рд╣реЛрддреА рд╣реИред рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдбреЗрд╡рд▓рдкрд░ рд╕рд╛рдЗрдЯ рд╕реЗ рдореМрдЬреВрджрд╛ рдкреИрдиреЛрд░рдорд╛ рдирдореВрдирд╛ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЧреЛрд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдмрдирд╛рд╡рдЯ рдЕрдВрджрд░ рдХреА рдУрд░ рдирд┐рдХрд▓реА рд╣реБрдИ рд╣реИред рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

mesh.scale.x = -1; 


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реЗрдХреНрдЯрд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдПрдХ рд░реЗ (рд░реЗрдХрд╛рд╕реНрдЯрд░) рдХреЛ "рд╢реВрдЯ" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмреАрдо рдХреНрд╖реЗрддреНрд░ рдХреА рджреАрд╡рд╛рд░ рдкрд░ рдирд╣реАрдВ рдЯрдХрд░рд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреИрдорд░рд╛ (рддрд╛рд░реНрдХрд┐рдХ рдмрд┐рдВрджреБ) рд╢реБрд░реБрдЖрдд) рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрдирд╛рд╡рдЯ рдХреЗрд╡рд▓ рдмрд╛рд╣рд░ рд╕реЗ рдЦрд┐рдВрдЪреА рд╣реБрдИ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рдЗрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

 mesh = new THREE.Mesh( new THREE.SphereGeometry( 500, 60, 40 ), new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'textures/2294472375_24a3b8ef46_o.jpg' ) side: THREE.BackSide } ) ); 


рд╡реИрд╕реЗ, рдпрд╣ THREE.js рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╕реНрддреБ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рд╕рд╛рдордЧреНрд░реА (рдмрдирд╛рд╡рдЯ), рдФрд░ рдлрд┐рд░ рджреГрд╢реНрдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рддрддреНрд╡реЛрдВ


рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рддрддреНрд╡ рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдлреНрд▓реИрдЯ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреИрдорд░реЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╣рд╛рдБ, рд╣рд╛рдБ рдпрд╣ рдмрд╛рдд рд╣реИ :)

рдЫрд╡рд┐

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЖрд╢реНрдЪрд░реНрдп рдореЗрдВ рд╣реИрдВред THREE.js рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рджреЛ "рд╡рд░реНрдЧ" рд╣реИрдВ: WebGLRenderer рдФрд░ CanvasRenderer ред рдФрд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд░рд▓ рд╡рд╕реНрддреБрдПрдБ: рдХрдг (рдХрдг) рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ ред WebGL рдкрд╛рд░реНрдЯрд┐рдХрд▓ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд╛рдЗрдЯ рдФрд░ рдХреИрдирд╡рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдореЗрдВ WebGL рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдХреЛрдИ рд╡реЙрд▓реНрдпреВрдо рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдЙрд╕ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рд╕рдорд╛рди рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рд╡рд┐рдорд╛рди рдЬреНрдпрд╛рдорд┐рддрд┐ (рдкреНрд▓реЗрдирдЧреНрд░реЛрдореЗрдЯреНрд░реА) рдХреЗ рд╕рд╛рде 3 рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ:

 var itemGeometry = new THREE.PlaneGeometry(35, 35), pointMapHovered = THREE.ImageUtils.loadTexture( "img/information-hover.PNG" ), pointMap = THREE.ImageUtils.loadTexture( "img/information-unhover.PNG" ); point = new THREE.Mesh( itemGeometry, new THREE.MeshBasicMaterial({ map: pointMap, transparent:true // ,  ,  -    }) ); 


рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ: рдмрд┐рдВрджреБ рдФрд░ рдмрдирд╛рд╡рдЯ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдорд╛рдЙрд╕ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрдирд╛рд╡рдЯ рдХреЛ рдПрдХ рдЙрдЬреНрдЬрд╡рд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореЗрд╢рдмреЗрд╕рд┐рдХрдореЗрдЯреНрд░реА рдХреИрд╢реНрдб рд╣реИ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рддреЛ рд╣рд░ рдХреЛрдИ рдкреНрд░рдХрд╛рд╢ рдХрд░реЗрдЧрд╛ред рдорд╛рдЙрд╕ рдХреЗ рдордБрдбрд░рд╛ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдпрд╣рд╛рдБ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ ред
рдЕрдВрддрд┐рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдерд╛, рд╡рд╣ рдЕрдВрдХ рдХреЗ рд╕рдЯреАрдХ рдЪрдпрди рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд▓реЙрдЧ рд╕реНрдерд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рдкреИрдиреЛрд░рдорд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкреБрдирд░реНрдЧрдгрдирд╛ рдерд╛ред рдиреЗрддреНрд░рд╣реАрди, рддрддреНрд╡ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреГрд╖реНрда рдкрд░ рдЙрдирдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 3 рдбреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред StackOverFlow рдкрд░ рдПрдХ рдЬрд╡рд╛рдм рдерд╛ред

рдбреЗрдЯрд╛


рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреГрд╖реНрда рдкрд░ рдХрдИ рдкреИрдиреЛрд░рдорд╛ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ JSON рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 { "points": [ { "coords": { "x": 302.0282521739266, "y": -32.30522607035554, "z": 389.86440214968525 }, "header": "", "body": "." }, ], "texture": "panorama.jpg", "name": " " } 


рд╡рд┐рднрд┐рдиреНрди рдкреИрдиреЛрд░рд╛рдорд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреНрд╖реЗрддреНрд░ рдХреА рдмрдирд╛рд╡рдЯ рдХреА рдЬрдЧрд╣ рд▓реЗрдВрдЧреЗ, рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдПрдВрдЧреЗ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдирдП рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред

рдХреНрдпрд╛ рд╣реБрдЖ?


рдореИрдВ рдЖрдкрдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ
рдбреЗрдореЛ
рдореИрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рдмреЗрдХрд░реА # 7 рдХрд╛ рд╡рд░реНрдгрди, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдирд╛рдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕рд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛрдИ рднреА рд╕рдВрдпреЛрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рд▓рд┐рдВрдХ

Source: https://habr.com/ru/post/In184488/


All Articles