рдирдорд╕реНрддреЗ, Habr! рдпреЛ рдореЗрд░реЛ рд╕рд┐рдХреНрд╡реЗрд▓ рд╣реЛ
рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдареВрд▓реЛ рд╕рдВрдШреАрдп рдХрдореНрдкрдиреАрдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛ рдмрд╕ рдмрдирд╛рдЗрд░рд╣реЗрдХрд╛ рдЫреМрдВред рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд░реЛрдз рдврд╛рдБрдЪрд╛рд╣рд░реВ, рд░реВрдкрд╛рдиреНрддрд░рдгрд╣рд░реВ, рдЬрдЯрд┐рд▓ рдорд╛рд░реНрдЧрд╣рд░реВред рдкрд░реАрдХреНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рд▓рд╛рдордорд╛ рдзреЗрд░реИ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрдиреБ рдкрд░реНрдЫред рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдПрдХ рджреБрдЦрд╛рдЗ рд╣реЛ рдЬреБрди рд╣рд░реЗрдХ chiropractor рд▓реЗ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рд╕рдХреНрджреИрдиред
рдкрд░рд┐рдЪрдп
рдпрджреНрдпрдкрд┐ рдореИрд▓реЗ рд╕реБрд░реБрдорд╛ рдпреЛ рдкреАрдбрд╛ рд╕рд╣рдиреБрдкрд░реЗрдХреЛ рдерд┐рдпреЛред рдпреЛ рд╕рдмреИ RFHUtil рдмрд╛рдЯ рд╕реБрд░реБ рднрдпреЛред рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рддрд░ рдЕрдкреНрдареНрдпрд╛рд░реЛ рд░ рдбрд░рд▓рд╛рдЧреНрджреЛ: рдареАрдХ рдЫ, рддрдкрд╛рдИрдВрд▓рд╛рдИ рд░рд╕ рдерд╛рд╣рд╛ рдЫред
рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп, рддрд░ рд╕рдХреНрд░рд┐рдп рдкреНрд░рдпреЛрдЧ рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛ рд▓рдЧрд╛рддрд╛рд░ рдЧрд┐рд░рд╛рд╡рдЯред
рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд░реАрдХреНрд╖рдг рдпрд╕рдХреЛ рд╕рд╛рде рдЕрд╕рдореНрднрд╡ рдЫред
JMeter рд╕рдВрдЧ рд╕рдмреИ рд╕рдЬрд┐рд▓реЛ рднрдПрдХреЛ рдЫред рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрдорд╛ рдирд┐рдкреБрдгрддрд╛ рд░ рдмрд╛рдиреА рдкрд░реЗрдкрдЫрд┐, рдЖрд╢рд╛рд▓реЗ рдЦреБрд╢реАрдХреЛ рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рди рдерд╛рд▓реНрдпреЛред
рдо рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ JMS рдкреНрд░рдХрд╛рд╢рдХ рд░ JMS рдЧреНрд░рд╛рд╣рдХ рдирдореВрдирд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред JMS рдкреЛрдЗрдиреНрдЯ-рдЯреБ-рдкреЛрдЗрдиреНрдЯрдХреЛ рд╡рд┐рдкрд░реАрдд, рдпреЛ рдЬреЛрдбреА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдердк рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреЗрдЦрд┐рдиреНрдереНрдпреЛред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, JMS рдЪрдпрдирдХрд░реНрддрд╛рдорд╛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрдВрд▓реЗ рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ Point-to-Point рд╕рдБрдЧ рддрдкрд╛рдИрдВ рд╕рдХреНрдиреБрд╣реБрдиреНрди (рд╡рд╛ рдпреЛ рд╡рд┐рдзрд┐ рдзреЗрд░реИ рд╕реНрдкрд╖реНрдЯ рдЫреИрди)ред
рдирдореВрдирд╛рд╣рд░реВ рддрдпрд╛рд░ рдЧрд░реНрджреИ
JMS рдкреНрд░рдХрд╛рд╢рдХ
- рд╕реЗрдЯрдЕрдк - рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдирд╛ред рдЕрдкрд╛рдЪреЗ
рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ рдпрджрд┐ рд▓рд╛рдо/рд╡рд┐рд╖рдпрд╣рд░реВ рдЪрд░ рдорд╛рд░реНрдлрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ рдпреЛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред - рдореНрдпрд╛рдж рд╕рдорд╛рдкреНрддрд┐ (ms) = 120000ред рдЕрд╕рдлрд▓ рднрдПрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрд░реЛрдзрд╣рд░реВ 2 рдорд┐рдиреЗрдЯ рдкрдЫрд┐ рд▓рд╛рдордмрд╛рдЯ рдЧрд╛рдпрдм рд╣реБрдиреЗрдЫрдиреНред
- рдЧреИрд░-рдирд┐рд░рдиреНрддрд░ рдбреЗрд▓рд┐рднрд░реА рдореЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╣реЛ? - рд╕рддреНрдпред IBM
рдЕрдиреБрдореЛрджрди рдЧрд░реНрджрдЫ рддреНрдпреЛ рдирд┐рд░рдиреНрддрд░ рдореЛрдбрд▓реЗ рдЕрдЪрд╛рдирдХ рд╡рд┐рдлрд▓рддрд╛рдХреЛ рдШрдЯрдирд╛рдорд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╕рдиреНрджреЗрд╢рд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдВрд░рдХреНрд╖рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрджрдЫред рд░ рдЧреИрд░-рдирд┐рд░рдиреНрддрд░ рдореЛрдбрдорд╛ рдЫрд┐рдЯреЛ рд╡рд┐рдирд┐рдордпред рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рдЧрддрд┐ рдмрдвреА рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢рдХрдорд╛ рдореИрд▓реЗ jms рдЧреБрдг рд╕реЗрдЯ рдЧрд░реНрдЫреБ рдЬреБрди рд╕рджрд╕реНрдпрд▓реЗ JMS рдЪрдпрдирдХрд░реНрддрд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫред рдкреНрд░рддреНрдпреЗрдХ рд╕рдмрдорд┐рд╢рдирдХреЛ рд▓рд╛рдЧрд┐, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЬрдирд╛ рддрддреНрд╡рдорд╛ рдЕрдирд┐рдпрдорд┐рдд рдорд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫ:
рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рддрдкрд╛рдЗрдБ рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рд╕рд╣реА рд╕рдиреНрджреЗрд╢ рдкрдврд┐рдПрдХреЛ рдЫред
рдкреВрд░реНрд╡-рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ JMS рдкреНрд░рдХрд╛рд╢рдХрдХреЛ тАЛтАЛрдЕрдиреНрддрд┐рдо "рдЦрд╛рд▓реА":
JMS рд╕рджрд╕реНрдп
- рд╕реЗрдЯрдЕрдк - рдкреНрд░рддреНрдпреЗрдХ рдирдореВрдирд╛ред рдЦреИрд░, рддрдкрд╛рдИрдВ рдмреБрдЭреНрдиреБрд╣реБрдиреНрдЫред
- рдЯрд╛рдЗрдордЖрдЙрдЯ (ms) = 100000ред рдпрджрд┐ рдЕрдиреБрд░реЛрдз 100 рд╕реЗрдХреЗрдиреНрдб рдкрд░реНрдЦрд╛рдЗ рдкрдЫрд┐ рд▓рд╛рдордорд╛ рдЖрдЗрдкреБрдЧреЗрди рднрдиреЗ, рдХреЗрд╣рд┐ рдЧрд▓рдд рднрдпреЛред
- рдирдореВрдирд╛рд╣рд░реВ рдмреАрдЪ рд░реЛрдХреНрдиреБрд╣реЛрд╕реН? - рд╕рддреНрдпред
JMS рдЪрдпрдирдХрд░реНрддрд╛ - рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ
рдкреНрд░рд╕рд╛рд░рд┐рдд рд╕рдиреНрджреЗрд╢рд╣рд░реВрдорд╛ рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛рд╕рдБрдЧ рдХрд╕рд░реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗред JMeter рдорд╛, рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛, рдкреНрд░реВрдлрд░реАрдбрд┐рдЩ рдкрдЫрд┐, рдпреЛ рдХреБрд░реВрдк рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреНрдЫред рдпрд╕рдмрд╛рдЯ рдмрдЪреНрди рд░ рд╕рдБрдзреИ рд░ рдЬрддрд╛рддрддреИ рдорд╣рд╛рди рд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реАрдХреЛ рдЖрдирдиреНрдж рд▓рд┐рди, рддрдкрд╛рдИрдВрд▓реЗ:
- JMeter "рд▓рдиреНрдЪрд░" рдорд╛ JVM рддрд░реНрдХ рдердкреНрдиреБрд╣реЛрд╕реН:
-Dfile.encoding=UTF-8
- JSR223 рдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░рд▓рд╛рдИ рдЧреНрд░реВрд╡реА рд▓рд╛рдЗрдирдХреЛ рд╕рд╛рде рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░рдорд╛ рдердкреНрдиреБрд╣реЛрд╕реН:
prev.setDataEncoding("UTF-8")
рдкрд╛рда рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН
рдЕрд▓реНрдЫреА рд╡рд┐рдХрд▓реНрдкред рднрд░реНрдЦрд░реИ рд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдбрд┐рдмрдЧ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрддред рд╡рд╛ рдХреЗрд╕рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬрдм рддрдкрд╛рдЗрдБ рдХрдореНрддрд┐рдорд╛ рдХреЗрд╣рд┐ рд╕рд╛рдиреЛ рдкрдард╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╡рд┐рдХрд▓реНрдк рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рдиреНрджреЗрд╢ рд╕реНрд░реЛрдд - Textarea рд░ рд╕рдиреНрджреЗрд╢рдХреЛ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд╛рда рдмреНрд▓рдХрдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН:
рдлрд╛рдИрд▓ рдЯреНрд░рд╛рдиреНрд╕рдлрд░
рд╕рдмреИрднрдиреНрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдкред рдзреЗрд░реИ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрддред рд╡рд┐рдХрд▓реНрдк рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рдиреНрджреЗрд╢ рд╕реНрд░реЛрдд - рдлрд╛рдЗрд▓рдмрд╛рдЯ рд░ рдХреНрд╖реЗрддреНрд░рдорд╛ рд╕рдиреНрджреЗрд╢ рдЬрд╛рдиреЗ рдмрд╛рдЯреЛ рд╕рдВрдХреЗрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдлрд╛рдЗрд▓ - рдлрд╛рдЗрд▓рдирд╛рдо:
рдлрд╛рдЗрд▓рд▓рд╛рдИ рдкрд╛рда рдХреНрд╖реЗрддреНрд░рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ
рд╕рдмреИрднрдиреНрджрд╛ рдмрд╣реБрдореБрдЦреА рд╡рд┐рдХрд▓реНрдкред рдзреЗрд░реИ рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд + JMS Point-to-Point рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╣рд╛рдБ рджреЛрд╕реНрд░реЛ рдкрдард╛рдЙрдиреЗ рд╡рд┐рдХрд▓реНрдк рдЫреИрди:
рдмрд╛рдЗрдЯ рдПрд░реЗ рдкрд╛рд╕ рдЧрд░реНрджреИ
рд╕рдмреИрднрдиреНрджрд╛ рдЧрд╛рд╣реНрд░реЛ рд╡рд┐рдХрд▓реНрдкред рдмрд┐рдирд╛ рд╡рд┐рд░реВрдкрдг, SMS рд░ perturbation рдмрд┐рдирд╛, рдмрд╛рдЗрдЯрдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдкрдорд╛ рд╕рд╣реА рдкреНрд░рд╕рд╛рд░рдг рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрддред рддрдкрд╛рдИрдВрд▓реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд JMeter рдорд╛ рдпреЛ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреБрд╣реБрдиреЗ рдЫреИрдиред
рддреНрдпрд╕реИрд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ
рд╡рд┐рдзрд┐рдорд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░рд┐рдПрдХреЛ рдЫ extractContent(..)
рд░реЗрдЦрд╛:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");
рдЦреБрд▓реНрд▓рд╛:
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
рд░ JMeter рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдгред
рдмрд╛рдБрдХреА рд╕рдмреИ JSR223 рдирдореВрдирд╛рд╣рд░реВ рдердкреНрди рд╣реЛред рдЕрдирд┐рдпрдорд┐рдд рдмрд╛рдЗрдЯрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рднрдПрдХреЛ DAT рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдкреНрд░рдХрд╛рд╢рдХ/рд╕рджрд╕реНрдпрддрд╛ рдЬреЛрдбреАрдХреЛ рдЕрдЧрд╛рдбрд┐ рдкрд╣рд┐рд▓реЛ рд╣реЛ:
import org.apache.commons.lang3.RandomUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
try {
FileOutputStream fos = new FileOutputStream(RESULT_FILE);
fos.write(arr);
fos.close();
} catch (IOException e) {
System.out.println("file not found");
}
рджреЛрд╕реНрд░реЛ - рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рдЕрдиреНрддреНрдпрдорд╛, рдлрд╛рдЗрд▓ рдореЗрдЯрд╛рдЙрдБрдЫ:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();
рд░ рдкреНрд░рдХрд╛рд╢рдХрдорд╛ рдлрд╛рдЗрд▓рдорд╛ рдорд╛рд░реНрдЧ рдердкреНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН:
рд░ рд╕рджрд╕реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ JSR223 рджрд╛рд╡реАрдорд╛ рдкрдирд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдордорд╛ рдЖрдЗрдкреБрдЧреЗрдХрд╛рд╣рд░реВрд╕рдБрдЧ рд╕реНрд░реЛрдд рдмрд╛рдЗрдЯрд╣рд░реВ рддреБрд▓рдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);
if (Arrays.equals(originalArray, changedArray))
{
SampleResult.setResponseMessage("OK");
} else {
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Comparison failed");
SampleResult.setResponseData("Bytes have changed","UTF-8");
IsSuccess=false;
}
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рдореИрд▓реЗ рд▓рд╛рдорд╣рд░реВрдорд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкрдард╛рдЙрдиреЗ рдЪрд╛рд░рд╡рдЯрд╛ рддрд░рд┐рдХрд╛рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реЗрдВ, рдЬреБрди рдо рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рд╣рд░реЗрдХ рджрд┐рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпреЛ рдЬрд╛рдирдХрд╛рд░реАрд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдЬреАрд╡рдирд▓рд╛рдИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрдЫред рдирд┐рд░рдиреНрддрд░рддрд╛рдорд╛, рдо рдПрдЙрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдиреНрдЬ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ рдореЗрд░реЛ рдЕрдиреБрднрд╡рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдЧрд░реНрдЫреБ рдЬрд╣рд╛рдБ рдПрдХ рдЫреЗрдЙрдорд╛ рд▓рд╛рдо рд░ рдЕрд░реНрдХреЛрдорд╛ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╡рд╛ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА рд╣реБрдиреНрдЫред
рдЖрдлреНрдиреЛ рд╕рдордп рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд░ рддрдкрд╛рдЗрдБрдХреЛ рдзреНрдпрд╛рди рдХреЛ рд▓рд╛рдЧреА рдзрдиреНрдпрд╡рд╛рджред
рд╕реНрд░реЛрдд: www.habr.com