рдХрдиреЗрдХреНрдЯ / рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдиреЛрдб рдпрд╛ рдЬреЗрдПрд╕ рдкрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдмрдбрд╝реА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреА рдереАрдВ, рд╡реЗ рд╢рд╛рдпрдж рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рдереЗред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖрдорддреМрд░ рдкрд░ рддреБрд░рдВрдд рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрддреА рд╣реИ, рдФрд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб!"

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдиреЗрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдВ:

var connect = require('connect'); var getName = function () { if (Math.random() > 0.5) { throw new Error('Can\'t get name'); } else { return 'World'; } }; var app = connect() .use(function (req, res, next) { try { var name = getName(); res.end('Hello, ' + name + '!'); } catch (e) { next(e); } }) .use(function (err, req, res, next) { res.end('Error: ' + err.message); }); app.listen(3000); 

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

рдЕрдм рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди getName рдлрд╝рдВрдХреНрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛:

 var connect = require('connect'); var getName = function (callback) { process.nextTick(function () { if (Math.random() > 0.5) { callback(new Error('Can\'t get name')); } else { callback(null, 'World'); } }); }; var app = connect() .use(function (req, res, next) { getName(function(err, name) { if (err) return next(err); res.end('Hello, ' + name + '!'); }); }) .use(function (err, req, res, next) { res.end('Error: ' + err.message); }); app.listen(3000); 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЕрдм рдкреНрд░рдпрд╛рд╕ / рдХреИрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдж рдореЗрдВ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдИрд╡реЗрдВрдЯ рд▓реВрдк рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░) рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - рд╣рдо рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

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

рдирд┐рд░реНрдгрдп



рд╕рдВрд╕реНрдХрд░рдг 0.8.0 рдореЗрдВ рд╢реБрд░реВ, рдбреЛрдореЗрди рдирд╛рдордХ рдПрдХ рддрдВрддреНрд░ Node.JS рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред ('uncaughtException')ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдбреЛрдореЗрди рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмреЗрдЪрдирд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рддрдВрддреНрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддреБрд░рдВрдд рдХрдиреЗрдХреНрдЯ / рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЬрд╛рдКрдВрдЧрд╛ред

рдХрдиреЗрдХреНрдЯ / рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рднреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдЕрдВрджрд░ рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ (4 рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рдбрд▓рд╡реЗрдпрд░) рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдИ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдХрдВрд╕реЛрд▓ рдкрд░ рдЯреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд╡рд▓ рд╕рдордХрд╛рд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

рдбреЛрдореЗрди рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рд╣рдо рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм, рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЕрдВрддрддрдГ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдиреЗрдХреНрдЯ / рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрд╛ рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ GitHub рдФрд░ npm рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

 var connect = require('connect'), connectDomain = require('connect-domain'); var app = connect() .use(connectDomain()) .use(function(req, res){ if (Math.random() > 0.5) { throw new Error('Simple error'); } setTimeout(function() { if (Math.random() > 0.5) { throw new Error('Asynchronous error from timeout'); } else { res.end('Hello from Connect!'); } }, 1000); }) .use(function(err, req, res, next) { res.end(err.message); }); app.listen(3000); 

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

 var connect = require('connect'), connectDomain = require('connect-domain'); var app = connect() .use(connectDomain()) .use(function(req, res){ if (Math.random() > 0.5) { throw new Error('Simple error'); } setTimeout(function() { if (Math.random() > 0.5) { process.nextTick(function() { throw new Error('Asynchronous error from process.nextTick'); }); } else { res.end('Hello from Connect!'); } }, 1000); }) .use(function(err, req, res, next) { res.end(err.message); }); app.listen(3000); 


рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдбреЛрдореЗрди рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдЕрднреА рднреА рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдФрд░ рдореИрдВ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯ рдХрднреА рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдорд╣реАрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрдкрдЯрд╛рдЗрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ред

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


All Articles