рд╣рд╛рдп рд╕рд╛рдерд┐рдпреЛрдВ!
рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╢рд┐рд▓реНрдкреЛрдВ рдХреЛ рдереНрд░рд┐рдлреНрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдереНрд░рд┐рдлреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдХрдиреАрдХ рд╣реИред рдЗрд╕реЗ рдлреЗрд╕рдмреБрдХ рдХреЗ рдмрд╛рдЙрд▓ рдореЗрдВ рдХрд╣реАрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдмрд╛рдЗрдирд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ RPC рд╕реЗрд╡рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рд▓реИрдВрдЧреНрд╡реЗрдЬ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ C #, C ++, Delphi, Erlang, Go, Java, PHP, Python, Ruby, рдЖрджрд┐ рдореЗрдВ "рдорд┐рддреНрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ" рдШрдЯрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реЗрд╡рд╛ рдФрд░ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдИрдбреАрдПрд▓ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, COM рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдШрдЯрдХ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдмрдВрдзрди рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ COM рдПрдХ рд╡рд┐рдВрдбреЛрдЬ-рдУрдирд▓реА рддрдХрдиреАрдХ рд╣реИ, рдЬрдмрдХрд┐ рдереНрд░рд┐рдлреНрдЯ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд╛рд╡рд╛ рд╕реЗ C ++ рдореЗрдВ рдХреБрдЫ рд▓реЛрдб-рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рддрд░реНрдХ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рджреЗрд╢реА C ++ рдХреЛрдб рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдЧрд╛, рдФрд░ рдПрдХ рдХреЗ рд▓рд┐рдП рдереНрд░рд┐рдлреНрдЯ RPC рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рдпрд╣ REST рд╕реЗ рддреЗрдЬ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ рддрдВрдмреВ рдФрд░ рд░реЗрдХ рдереЗ!
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
1. рд╣рдордиреЗ рдмреВрд╕реНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ
$ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
2.
рдереНрд░рд┐рдлреНрдЯ рдЯрд╛рд░рдмреЙрд▓
рдЕрдкрд╛рдЪреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
softded.ru/thrift/0.9.0/thrift-0.9.0.tx.zрдЕрдирдкреИрдХ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред
$ ./configure $ make $ sudo make install
рдпрд╣ рд╕рдм рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ ... рдЖрдк рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдереНрд░рд┐рдлреНрдЯ рдЯрд╛рд░рдмреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
$ thrift --gen cpp tutorial.thrift
рдереНрд░рд┐рдлреНрдЯ рдХрдорд╛рдВрдб C ++ рд░реИрдкрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдФрд░ рдзреНрдпрд╛рди рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЬреАрди-рд╕реАрдкреАрдкреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред рд╡рд╣реА рдЬрд╛рд╡рд╛, рдкреАрдПрдЪрдкреА, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...
рд╣рдо рдЙрддреНрдкрдиреНрди рд╕реНрд░реЛрдд рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ
$ g++ -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -o something
рдУрд╣, рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
рддреНрд░реБрдЯрд┐: 'uint32_t' рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИрдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ uint32_t рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдереНрд░реВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдХреЙрдХрд░реЛрдЪ рд╣реИред рдЗрд╕рдХрд╛ рдЗрд▓рд╛рдЬ "#include <stdint.h>" рдХреЛ "Thrift.h", рдпрд╛ (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛) рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ
-DHAVE_NETINET_IN_H -DHAVE_INTTYRES_H рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИрдЕрдм рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
$ g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -o something
рдпрд╣ рд╕рдм, рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕реЗ рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐: libthrift.so.0: рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд╣реАрдВ рдЦреЛрд▓ рд╕рдХрддреЗ: рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВрдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ / usr / local / lib / / lib рд╕реЗ рдереНрд░рд┐рдлреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛
рдпрд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рд╢реБрд░реВ рд╣реБрдЖред рддреЛ, рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЖрдк рдЕрдкрдирд╛ RPC рд╕рд░реНрд╡рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реЛрдирд╛ рд╣реИред рд╕реНрдЯреЛрд░ рд▓рдВрдмреЗ (рдХрдИ рд╕реМ рд╣рдЬрд╛рд░) рдмрд┐рдЯ рдорд╛рд╕реНрдХред рдЙрдиреНрд╣реЗрдВ (рдФрд░) рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрдВ, рдЬреЛ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ред рд╣рд╛рдВ, рд░реЗрдбрд┐рд╕ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред
рдкреВрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ:
github.com/2anikulin/fast-hands.gitрд╣рдо рдбреЗрдЯрд╛ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди
рдереНрд░рд┐рдлреНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ :
namespace cpp fasthands namespace java fasthands namespace php fasthands namespace perl fasthands exception InvalidOperation { 1: i32 what, 2: string why } service FastHandsService { i32 put(1:i32 key, 2:binary value), binary get(1:i32 key), list <i32> bitAnd(1:list<i32> keys) throws (1:InvalidOperation ouch) }
рдФрд░ рд░реИрдкрд░ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдпрд╣ рдХреЛрдб RPC рд╕рд░реНрд╡рд░ рдмрдирд╛рддрд╛ рдФрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
#define PORT 9090 #define THREAD_POOL_SIZE 15 int main() { printf("FastHands Server started\n"); shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); shared_ptr<FastHandsHandler> handler(new FastHandsHandler()); shared_ptr<TProcessor> processor(new FastHandsServiceProcessor(handler)); shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(THREAD_POOL_SIZE); shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory()); threadManager->threadFactory(threadFactory); threadManager->start(); TNonblockingServer server(processor, protocolFactory, PORT, threadManager); server.serve(); printf("done.\n"); return 0; }
FastHandsHandler рд╡рд░реНрдЧ рдореЗрдВ - рд╣рдорд╛рд░реА рд╕рднреА рд▓рд╛рдЧреВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ
рдпрд╣ рд╣реИрдбрд░ рдлрд╛рдЗрд▓ рд╣реИред
class FastHandsHandler : virtual public FastHandsServiceIf { public: FastHandsHandler(); int32_t put(const int32_t key, const std::string& value); void get(std::string& _return, const int32_t key); void bitAnd(std::vector<int32_t> & _return, const std::vector<int32_t> & keys); private: void appendBitPositions(std::vector<int32_t> & positions, unsigned char bits, int offset); private: std::map<int32_t, std::string> m_store; };
рд╣рдо рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
c ++ рдЕрдкрд╛рдЪреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЕрдкрд╛рдЪреЗ :: рдереНрд░рд┐рдлреНрдЯ :: рд╕рд░реНрд╡рд░ :: TNonblockedServerрддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐, рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ TNonblockingServer рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирд┐рд░реНрдорд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВ
-Lthriftnb -leventрдпрд╛рдиреА рдЕрдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧреА:
g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -lthriftnb -levent -o something
рдЕрдм рд╕рдм рдареАрдХ рд╣реИред рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╣рдо рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдРрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
import fasthands.FastHandsService; import fasthands.InvalidOperation; import org.apache.thrift.TException; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransportException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; public class JavaClient { public static void main(String [] args) { TTransport transport = new TFramedTransport(new TSocket("localhost", 9090)); TProtocol protocol = new TBinaryProtocol(transport); final FastHandsService.Client client = new FastHandsService.Client(protocol); final List<Integer> filters = new ArrayList<Integer>(); try { transport.open(); int count = 12500; byte bt[] = new byte[count]; for (int i =0; i < count; i++) { bt[i] = (byte)0xFF; } for (int i = 0; i < 50; i++) { client.put(i, ByteBuffer.wrap(bt)) ; filters.add(i); } List<Integer> list = client.bitAnd(filters); System.out.println(list.size()); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } transport.close(); } }
рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдХрдиреАрдХ, рдФрд░ рдирдВрдЧреЗ рд╕реА ++ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╣рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреБрд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ REST рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ, рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рднреА http рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рд╕реЗ C ++ рдореЗрдВ рд▓рд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ, рдпрд╣ 1.2 - 1.4 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рд╡рд╣рди рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╛рдВрдХрди + рд╡реНрдпрдпред