рдореАрдЯрд░ рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЯреЗрд▓реАрдлрд╝реЛрди рдкрд░ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рдкрд╣рдЪрд╛рди

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐



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



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



рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ - рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ / рджреЛрд╕реНрддреЛрдВ / рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдЫреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рдкрд░реЗрд╢рд╛рдиреА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрд╛рдпрд▓рд░ рдХреЛ рдЪрд╛рд▓реВ рдФрд░ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХреЗрдВред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдкрдбрд╝реЛрд╕реА рд╣реИ рдЬреЛ рд╣рд░ рджрд┐рди рдЖрдПрдЧрд╛ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░ рдЕрдЧрд░ рдирд╣реАрдВ? рдпрд╛ рд╡рд╣ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рднреА рдХрд░реЗрдЧрд╛?



рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдореАрдЯрд░ рдХреА рд░реАрдбрд┐рдВрдЧ рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдПрдХ рд▓рдВрдмреА рдпрд╛рддреНрд░рд╛ рдХреЗ рджреМрд░рд╛рди рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХреВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧреИрд╕ рдмрд░реНрдмрд╛рдж рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЕрдЪрд╛рдирдХ рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреВрдВ, рддреЛ рддреБрд░рдВрдд рд░рд┐рд╢реНрддреЗрджрд╛рд░реЛрдВ / рджреЛрд╕реНрддреЛрдВ / рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ (рдпрд╛ рдЬреЛ рдХреЛрдИ рднреА рдореБрдЭреЗ рдлреЛрди рдХрд░реЗрдВ) рдмрдЯрди рдЫреЛрдбрд╝ рдХрд░ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП)



рдмреЗрд╢рдХ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдкреНрд░рд╢рдВрд╕рд╛рдкрддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рд╢рдВрд╕рд╛рдкрддреНрд░ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рднрд╛рдЧ 2 рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ред



рднрд╛рдЧ 1. рдореАрдЯрд░ рд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбрд╛рд▓рдирд╛



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



рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


рдореАрдЯрд░ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдлрд┐рд░ рдЗрди рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ III (SCH-I535) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╣рд╛рдВ, рд╢рд╛рдпрдж, рд╣рд░ рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдПрдХ рддреАрд╕рд░реА рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрд╣реБрдд рд╢рд╛рдирджрд╛рд░ рд╣реИрдВ:



рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╡рд░реНрдХрд┐рдВрдЧ рд╕реНрдХреНрд░реАрди, рдЯрдЪ рд╕реНрдХреНрд░реАрди, рдорд╛рдЗрдХреНрд░реЛрдлреЛрди, рд╕реНрдкреАрдХрд░ рдЖрджрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВред рдпрд╣ рддрдереНрдп рд▓рд╛рдЧрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред



EBay рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЯреВрдЯреЗ рд╣реБрдП рдлреЛрди рдЦрд░реАрджрдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рд╢реМрдХ рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдорд╛рдЗрдХреНрд░реЛрдлреЛрди (~ $ 10) рдХреЗ рд╕рд╛рде рдПрдХ sgs3 рдорджрд░рдмреЛрд░реНрдб, рд╕рд╛рде рд╣реА рдПрдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдХреИрдорд░рд╛ (~ $ 10) рдФрд░ рдПрдХ рдЪреАрдиреА рдмреИрдЯрд░реА (~ 300 рд░рдЧрдбрд╝)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреЛрд░реНрдб рдХреЛ рдмреИрдЯрд░реА рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЯреВрдЯреЗ рд╣реБрдП рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдлреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред





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



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



рдорд╢реАрди рдХреА рд╕реЗрдЯрд┐рдВрдЧ


рд╣рдо рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХреЛрдИ рдбрд┐рд╕реНрдкреНрд▓реЗ рдпрд╛ рдЯрдЪрд╕реНрдХреНрд░реАрди рдирд╣реАрдВ рд╣реИ, рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдореЗрдВ рд░реВрдЯ рдирд╣реАрдВ рд╣реИ, рдПрдбреАрдмреА рдбреАрдмрдЧрд┐рдВрдЧ рдЕрдХреНрд╖рдо рд╣реИ, рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИред



рд░реАрдПрдирд┐рдореЗрд╢рди


рдЪреЗрддрд╛рд╡рдиреА! рдирд┐рдореНрди рдирд┐рд░реНрджреЗрд╢ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ III (SCH-I535) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рд╣реИ, рддреЛ рдХреНрд░рд┐рдпрд╛рдПрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред



рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк adb, рдлрд░реНрдорд╡реЗрдпрд░ рдЖрджрд┐ рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред



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



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



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





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

 malefic@lepeshka:~$ adb devices List of devices attached 64cb5c59 recovery
      
      





рдорд╛рдЙрдВрдЯ рдкреНрд░рдгрд╛рд▓реА:

 malefic@lepeshka:~$ adb shell mount -o rw -t ext4 /dev/block/platform/msm_sdcc.1/by-name/system /system
      
      





/System/build.prop рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

 malefic@lepeshka:~$ adb shell "echo \"persist.service.adb.enable=1\" >> /system/build.prop"
      
      





рд░реАрдмреВрдЯ:

 malefic@lepeshka:~$ adb reboot
      
      





рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ adb рд╕реНрдЯреЗрдЯрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:

 malefic@lepeshka:~$ adb devices List of devices attached 64cb5c59 device
      
      





рдмрд┐рдВрдЧреЛ! рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрд╛рд▓реВ рд╣реИ, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рд╡рд╛ рд╡реЗрдм рд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ AndroidScreenCast рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:





рдпрд╣ Verizon SIM рдХрд╛рд░реНрдб рд╕рдХреНрд░рд┐рдпрдг рд╕реНрдХреНрд░реАрди рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╕рд┐рдо рдХрд╛рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ:

рднрд╛рд╖рд╛ рдЪрдпрди рд╕реНрдХреНрд░реАрди рдкрд░, рд╕реНрдХреНрд░реАрди рдкрд░ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ (рдЖрдкрд╛рддрдХрд╛рд▓реАрди рдХреЙрд▓ рдмрдЯрди рдХреЗ рдКрдкрд░), рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдХреЛрдиреЗ, рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ, рдирд┐рдЪрд▓реЗ рджрд╛рдПрдВ рдФрд░ рд╡реЙрд▓реНрдпреВрдо + рдкрд░ рдЯреИрдк рдХрд░реЗрдВ


рдЕрд░реНрдерд╛рддреН:

 malefic@lepeshka:~$ adb shell input tap 10 1150 malefic@lepeshka:~$ adb shell input tap 710 1150 malefic@lepeshka:~$ adb shell input tap 10 1150 malefic@lepeshka:~$ adb shell input tap 710 1150
      
      





рддрдм рдореИрдВ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ Vol Up рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реВрдВ, рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:





рдПрдХ рдЯрд┐рдХ рд▓рдЧрд╛рдПрдВ рдФрд░ рдУрдХреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb shell input tap 50 600 malefic@lepeshka:~$ adb shell input tap 650 600
      
      









рд╕реНрдХреНрд░реАрди рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb shell input swipe 100 100 500 100
      
      









рдЕрдм рдЖрдкрдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ vnc рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Android VNC рд╕рд░реНрд╡рд░ ред рдЗрд╕реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb install droid+VNC+server+v1.1RC0.apk 4055 KB/s (2084419 bytes in 0.501s) pkg: /data/local/tmp/droid+VNC+server+v1.1RC0.apk Success
      
      





рдЬрдм рд╣рдо vnc рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рд╕реНрдХреНрд░реАрди рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВ: рд╣рдо рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЛ рдЬрдЧрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реЛрддрд╛ рдерд╛ред

 malefic@lepeshka:~$ adb shell input keyevent 26 malefic@lepeshka:~$ adb shell input swipe 100 100 500 100
      
      





рд╣рдо vnc рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 malefic@lepeshka:~$ adb shell am start -a android.intent.action.Main -n org.onaips.vnc/.MainActivity
      
      









рдареАрдХ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb shell input tap 50 900
      
      









рдкреНрд░рд╛рд░рдВрдн рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb shell input tap 350 300
      
      









рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:

 malefic@lepeshka:~$ adb shell input tap 600 1000
      
      









рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо adb рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 malefic@lepeshka:~$ adb forward tcp:5801 tcp:5801 malefic@lepeshka:~$ adb forward tcp:5901 tcp:5901
      
      





рдФрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ vnc рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдкрд░ рдЬрд╛рдПрдВред





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



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



рдЖрд╡рдзрд┐рдХ рдлреЛрдЯреЛрдЧреНрд░рд╛рдлреА


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



рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдлреЛрди (рд╢реАрд░реНрд╖ рджреГрд╢реНрдп) рд░рдЦрд╛:





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



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





рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдлреИрд▓ рдЧрдпрд╛


рдореАрдЯрд░ рдХреА рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рднрд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ - FolderSync рд▓рд╛рдЗрдЯ ред рдпрд╣ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдПрдХ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google рдбреНрд░рд╛рдЗрд╡ рдкрд░ред



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



рднрд╛рдЧ 2. рдорд╛рдиреНрдпрддрд╛



рдЗрд╕рд▓рд┐рдП, рдореАрдЯрд░ рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд░реАрдбрд┐рдВрдЧ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╣рдЪрд╛рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:





рдкрд╛рдпрдерди рдХреЛ рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, OpenCV рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдпрд╣рд╛рдБ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ рдПрдХ рдмрд╛рд░ рддрд╛рдЬ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 import sys import os from models import getImage, sess from gdrive import getImagesFromGDrive, createImageFromGDriveObject if __name__ == '__main__': #        images, http = getImagesFromGDrive() #      for img_info in images: #   img = createImageFromGDriveObject (img_info, http) file_name = img_info['title'] #     try: dbimage = getImage(os.path.basename(file_name)) dbimage.img = img dbimage.download_url = img_info["downloadUrl"] dbimage.img_link = img_info['webContentLink'].replace('&export=download','') except ValueError as e: print e continue #   dbimage.identifyDigits() #     sess.commit()
      
      





рдпрд╣ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдореИрдВ рдиреАрдЪреЗ рджреВрдВрдЧрд╛:



Google рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ Google рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

 import os from datetime import tzinfo, timedelta, date from dateutil.relativedelta import relativedelta from apiclient.discovery import build from models import getLastRecognizedImage def getImagesFromGDrive(): #  id  Google ,     FOLDER_ID = '0B5mI3ROgk0mJcHJKTm95Ri1mbVU' #     http = getAuthorizedHttp() #    drive_service = build('drive', 'v2', http=http) #         ,      month_ago = date.today() + relativedelta( months = -1 ) q = "'%s' in parents and mimeType = 'image/jpeg' and trashed = false and modifiedDate<'%s'" % (FOLDER_ID, month_ago.isoformat()) files = drive_service.files().list(q = q, maxResults=1000).execute() for image in files.get('items'): drive_service.files().trash(fileId=image['id']).execute() #     ,     last_image = getLastRecognizedImage() #     ,          page_size = 1000 result = [] pt = None #   API        1000 , #      1000       while True: q = "'%s' in parents and trashed = false and mimeType = 'image/jpeg' and modifiedDate>'%s'" % (FOLDER_ID, last_image.check_time.replace(tzinfo=TZ()).isoformat('T')) files = drive_service.files().list(q = q, maxResults=page_size, pageToken=pt).execute() result.extend(files.get('items')) pt = files.get('nextPageToken') if not pt: break #  ,        result.reverse() return result, http
      
      





рдЕрдзрд┐рдХреГрдд рдбреНрд░рд╛рдЗрд╡ рдХреНрд▓рд╛рдЗрдВрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 import httplib2 import ConfigParser from oauth2client.client import OAuth2WebServerFlow from oauth2client.file import Storage def getAuthorizedHttp(): #    config.ini   CLIENT_ID  CLIENT_SECRET config = ConfigParser.ConfigParser() config.read([os.path.dirname(__file__)+'/config.ini']) CLIENT_ID = config.get('gdrive','CLIENT_ID') CLIENT_SECRET = config.get('gdrive','CLIENT_SECRET') # OAuth 2.0 scope that will be authorized. # Check https://developers.google.com/drive/scopes for all available scopes. OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive' # Redirect URI for installed apps REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob' #   client_secrets.json    storage = Storage(os.path.dirname(__file__) + '/client_secrets.json') credentials = storage.get() #     ,     if not credentials: # Perform OAuth2.0 authorization flow. flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) authorize_url = flow.step1_get_authorize_url() #    ,       print 'Go to the following link in your browser: ' + authorize_url #   code = raw_input('Enter verification code: ').strip() credentials = flow.step2_exchange(code) #   storage.put(credentials) #  http     http = httplib2.Http() credentials.authorize(http) return http
      
      





Google рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдВрд╕реЛрд▓ рдореЗрдВ CLIENT_ID рдФрд░ CLIENT_SECRET рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП API рдФрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ - рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ - OAuth рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, NEW CLIENT ID рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ - рдЕрдиреНрдп рд╡рд╣рд╛рдБ :





рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреА url рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Google рдбреНрд░рд╛рдЗрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ Google рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ client_secrets.json



рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╕рднреА client_secrets.json



рдХреЛ client_secrets.json



рдФрд░ рдмрд╛рдж рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдкреВрдЫреЗрдЧрд╛ред



рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдорд╛рд░реЛрд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ:

 import cv2 import numpy as np def downloadImageFromGDrive (downloadUrl, http=None): if http==None: http = getAuthorizedHttp() #   resp, content = http.request(downloadUrl) #    OpenCV img_array = np.asarray(bytearray(content), dtype=np.uint8) return cv2.imdecode(img_array, cv2.IMREAD_COLOR) def createImageFromGDriveObject (img_info, http=None): return downloadImageFromGDrive(img_info['downloadUrl'], http)
      
      







рдлреЛрдЯреЛ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ


рдлрд╝реЛрдЯреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдкрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рдЪрд╛рдиреЗрдВрдЧреЗред extractDigitsFromImage



рд╡рд┐рдзрд┐ extractDigitsFromImage



:

  def extractDigitsFromImage (self): img = self.img
      
      





рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдлреЛрдЯреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:





рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗред

  #   90  h, w, k = img.shape M = cv2.getRotationMatrix2D((w/2,h/2),270,1) img = cv2.warpAffine(img,M,(w,h))
      
      









  #   ,    img = img[0:h, (wh)/2:h+(wh)/2] h, w, k = img.shape
      
      





рдЕрдм рдПрдХ рд▓рд╛рд▓ рдлреНрд░реЗрдо рд╕реЗ рдШрд┐рд░реА рдЫрд╡рд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЗ рднреАрддрд░ рдХрд╛рдлреА рдЕрдиреЛрдЦреА рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рдпрд▓ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ sample.jpg



рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦрд╛:

  #       sample = cv2.imread(os.path.dirname(__file__)+"/sample.jpg") sample_h, sample_w, sample_k = sample.shape #       res = cv2.matchTemplate(img,sample,cv2.TM_CCORR_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) #      x_center = max_loc[0] + sample_w/2 y_center = max_loc[1] + sample_h/2 #        ,      , #        if x_center>w*0.6: img = img[0:h, 0.2*w:w] h, w, k = img.shape x_center = x_center-0.2*w
      
      









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

  #      gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #    Canny edges = cv2.Canny(gray, 100, 200)
      
      









рдЕрдм рд╣рдо рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЫрд╡рд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, HoughLines



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

  #    lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
      
      









рдкрд╛рдИ рдЧрдИ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ, рд╣рдо рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдХреНрд╖реИрддрд┐рдЬ рд░реЗрдЦрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЦреЛрдЬреЗ рдЧрдП рдХреЗрдВрджреНрд░ (рдПрдХ рдКрдкрд░ рдФрд░ рдПрдХ рдиреАрдЪреЗ) рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рдкрд╛рддреЗ рд╣реИрдВред

  #    rho_below = rho_above = np.sqrt(h*h+w*w) line_above = None line_below = None for line in lines: rho,theta = line[0] sin = np.sin(theta) cos = np.cos(theta) #     if (sin<0.7): continue #       ,    ""  rho_center = x_center*cos + y_center*sin #      if rho_center>rho and rho_center-rho<rho_above: rho_above = rho_center-rho line_above = {"rho":rho, "theta":theta, "sin":sin, "cos":cos} #      if rho_center<rho and rho-rho_center<rho_below: rho_below = rho-rho_center line_below = {"rho":rho, "theta":theta, "sin":sin, "cos":cos} # ,      if line_below==None or line_above==None: mylogger.warn("No lines found") return False # ,           if rho_below/rho_above>1.7 or rho_below/rho_above<0.6: mylogger.warn("Wrong lines found: %f" % (rho_below/rho_above)) return False
      
      









рд╣рдо рдЫрд╡рд┐ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдорд┐рд▓реА рд╣реБрдИ рд░реЗрдЦрд╛рдПрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрд╖реИрддрд┐рдЬ рд╣реЛ рдЬрд╛рдПрдВ:

  #  M = cv2.getRotationMatrix2D((0,(line_below["rho"]-line_above["rho"])/2+line_above["rho"]),line_above["theta"]/np.pi*180-90,1) img = cv2.warpAffine(img,M,(w,h))
      
      









рдЕрдм рдЬреЛ рдХреБрдЫ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкреАрдЫреЗ рд╕рдм рдХреБрдЫ рдХрд╛рдЯ рджреЗрдВ:

  #  img = img[line_above["rho"]:line_below["rho"], 0:w] h, w, k = img.shape
      
      









рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдбрд╛рдпрд▓ рдХреЗ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЫрд╡рд┐ рдХреЛ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  #   gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) thres = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
      
      









рд╣рдо "рдХреЗрдВрджреНрд░реАрдп" рдмрд┐рдВрджреБ рдХреЗ рд╕рдорд╛рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдХрд┐рдирд╛рд░реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд рд╣реИ:

  sample_right = cv2.imread(os.path.dirname(__file__)+"/sample_right.jpg",cv2.IMREAD_GRAYSCALE) #      res = cv2.matchTemplate(thres,sample_right,cv2.TM_CCORR_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) #    x_right = max_loc[0]-6
      
      





рдмрд╛рдИрдВ рд╕реАрдорд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢реЛрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкрди рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

  #   kernel = np.ones((7,7),np.uint8) thres = cv2.morphologyEx(thres, cv2.MORPH_CLOSE, kernel)
      
      









рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВрдЧреЗ, рдЬрдм рддрдХ рд╣рдо рдХрд╛рд▓реЗ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рд╣реЛрдЧрд╛:

  #    x_left=0 while x_left<w : if thres[h/2,x_left]==0: break x_left+=1
      
      









рдЫрд╡рд┐ рдХреЛ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдХреНрд░реЙрдк рдХрд░реЗрдВ:

  #     img = img[:, x_left:x_right] h, w, k = img.shape
      
      









рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЪреЗрдХ рдмрдирд╛рдПрдВ рдХрд┐ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд┐рд▓реА рдЫрд╡рд┐ рдбрд╛рдпрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:

  #    if float(w)/float(h)<6.5 or float(w)/float(h)>9.5: mylogger.warn("Image has bad ratio: %f" % (float(w)/float(h))) return False self.digits_img = img return True
      
      







рдирдВрдмрд░реЛрдВ рдкрд░ рд╡рд┐рднрд╛рдЬрди


splitDigits



рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдбрд╛рдпрд▓ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрдХреЛрдВ рдореЗрдВ splitDigits



рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  def splitDigits (self): # ,     ,    if None == self.digits_img: if not self.extractDigitsFromImage(): return False img = self.digits_img h, w, k = img.shape
      
      





рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╣рдорд╛рд░реА рдбрд╛рдпрд▓ рдХреЛ 8 рдмрд░рд╛рдмрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХрд╛рдЯреЗрдВ:





рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 7 рднрд╛рдЧреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ 8 рд╡рд╛рдВ рдЕрдВрдХ рд▓рдЧрд╛рддрд╛рд░ рдШреВрдо рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ b / w рдореЗрдВ adaptiveThreshold



рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ:

  #    8       for i in range(1,8): digit = img[0:h, (i-1)*w/8:i*w/8] dh, dw, dk = digit.shape #   / digit_gray = cv2.cvtColor(digit,cv2.COLOR_BGR2GRAY) digit_bin = cv2.adaptiveThreshold(digit_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 0)
      
      









рд╣рдо рдЙрджреНрдШрд╛рдЯрди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдорджрдж рд╕реЗ рд╢реЛрд░ рдХреЛ рдереЛрдбрд╝рд╛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдПрдХ 2x2 рдХрд░реНрдиреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд▓реЗ рдХреВрджрдиреЗ рд╡рд╛рд▓реЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрдбрд╝реЗ рд╕рдлреЗрдж рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрд╛рдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:

  #   kernel = np.ones((2,2),np.uint8) digit_bin = cv2.morphologyEx(digit_bin, cv2.MORPH_OPEN, kernel)
      
      









рд╕рдореЛрдЪреНрдЪ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪрд▓рд╛рдПрдБ

  #   other, contours, hierarhy = cv2.findContours(digit_bin.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
      
      









рдЗрд╕рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЖрдХреГрддрд┐ рдФрд░ рдЖрдХреГрддрд┐ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ, рдлрд┐рд░ рд╣рдо рд╢реЗрд╖ рднрд╛рдЧ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдореЛрдЪреНрдЪ рдкрд╛рдПрдВрдЧреЗ:

  #   biggest_contour = None biggest_contour_area = 0 for cnt in contours: M = cv2.moments(cnt) #       if cv2.contourArea(cnt)<30: continue #       if cv2.arcLength(cnt,True)<30: continue #     cx = M['m10']/M['m00'] cy = M['m01']/M['m00'] #  ,     -   if cx/dw<0.3 or cx/dw>0.7: continue #    if cv2.contourArea(cnt)>biggest_contour_area: biggest_contour = cnt biggest_contour_area = cv2.contourArea(cnt) biggest_contour_cx = cx biggest_contour_cy = cy #       ,      if biggest_contour==None: digit = self.dbDigit(i, digit_bin) digit.markDigitForManualRecognize (use_for_training=False) mylogger.warn("Digit %d: no biggest contour found" % i) continue
      
      









рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рдореЛрдЪреНрдЪ рд╣рдорд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдПрдХ рдореБрдЦреМрдЯрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд░реЗ рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ:

  #  ,        mask = np.zeros(digit_bin.shape,np.uint8) cv2.drawContours(mask,[biggest_contour],0,255,-1) digit_bin = cv2.bitwise_and(digit_bin,digit_bin,mask = mask)
      
      









рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рдореЛрдЪреНрдЪ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдорд╛рдирдХ рдЖрдХрд╛рд░ рдХреА рдЖрдпрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

  #     rw = dw/2.0 rh = dh/1.4 # ,        if biggest_contour_cy-rh/2 < 0: biggest_contour_cy = rh/2 if biggest_contour_cx-rw/2 < 0: biggest_contour_cx = rw/2
      
      









рд╣рдо рдЫрд╡рд┐ рдХреЛ рдПрдХ рдЖрдпрдд рдореЗрдВ digit_base_h = 2



рдФрд░ рдЗрд╕реЗ рджрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдореЗрдВ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ digit_base_h = 2



4, digit_base_w = 16



ред рдкрд░рд┐рдгрд╛рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред

  #   digit_bin = digit_bin[int(biggest_contour_cy-rh/2):int(biggest_contour_cy+rh/2), int(biggest_contour_cx-rw/2):int(biggest_contour_cx+rw/2)] #     digit_bin = cv2.resize(digit_bin,(digit_base_w, digit_base_h)) digit_bin = cv2.threshold(digit_bin, 128, 255, cv2.THRESH_BINARY)[1] #    digit = self.dbDigit(i, digit_bin) return True
      
      









рдЕрдВрдХ рдорд╛рдиреНрдпрддрд╛


рдпрд╣рд╛рдБ identifyDigits



рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

  def identifyDigits(self): #    ,     if self.result!='': return True #      if len(self.digits)==0: #    ,     if self.img == None: return False #   if not self.splitDigits(): return False #    ,      sess.commit() #     for digit in self.digits: digit.identifyDigit() #     str_digits = map(str,self.digits) #       ,        if '?' in str_digits: return False #       self.result = ''.join(str_digits) return True
      
      





рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИ, рдХреЗрд╡рд▓ identifyDigit



рдкрджреНрдзрддрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░:

  def identifyDigit (self): #    ,     if self.result!='?': return True if not KNN.recognize(self): #     ,       self.markDigitForManualRecognize() #   7- ,     "0",        ,   ,     if self.i==7: self.result = 0 return True return False else: self.use_for_training = True return True
      
      





identifyDigit



рд╡рд┐рдзрд┐ рднреА рддреБрдЪреНрдЫ рд╣реИ, рдорд╛рдиреНрдпрддрд╛ KNN.recognize



рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИ, OpenCV рд╕реЗ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  @staticmethod def recognize(dbdigit): # ,     if not KNN._trained: KNN.train() #   ,   ,     h,w = dbdigit.body.shape if h!=digit_base_h or w!=digit_base_w: dbdigit.markDigitForManualRecognize(use_for_training=False) mylogger.warn("Digit %d has bad resolution: %dx %d" % (dbdigit.i,h,w)) return False #        sample = dbdigit.body.reshape(digit_base_h*digit_base_w).astype(np.float32) test_data = np.array([sample]) #     , -  - 5 knn = KNN.getKNN() ret,result,neighbours,dist = knn.find_nearest(test_data,k=5) #     if result[0,0]!=neighbours[0,0]: #       dbdigit.markDigitForManualRecognize() return False if neighbours[0,1]!=neighbours[0,0] or neighbours[0,2]!=neighbours[0,0]: #         dbdigit.markDigitForManualRecognize() return False if dist[0,0]>3000000 or dist[0,1]>3500000 or dist[0,2]>4000000: #         dbdigit.markDigitForManualRecognize() return False #    ,        dbdigit.result = str(int(ret)) return True
      
      





рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ KNN.train



:

  @staticmethod def getKNN(): #      cv2.KNearest if KNN._knn==None: KNN._knn = cv2.KNearest() return KNN._knn @staticmethod def train(): knn = KNN.getKNN() #        train_digits = sess.query(Digit).filter(Digit.result!='?').filter_by(use_for_training=True).all() train_data = [] responses = [] for dbdigit in train_digits: h,w = dbdigit.body.shape #     if h*w != digit_base_h*digit_base_w: continue #     sample = dbdigit.body.reshape(digit_base_h*digit_base_w).astype(np.float32) train_data.append(sample) responses.append(int(dbdigit.result)) #  KNN knn.train(np.array(train_data), np.array(responses)) KNN._trained = True
      
      







models.py



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

рд▓реЗрдЦ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЧреБрдо рд╣реИ
 import datetime from sqlalchemy import Column, Integer, String, Text, Boolean, ForeignKey, DateTime, PickleType from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import base64 import cv2 import numpy as np import os import logging import sys dbengine = create_engine('sqlite:///' + os.path.dirname(__file__) + '/../db/images.db', echo=False) Session = sessionmaker(bind=dbengine) sess = Session() Base = declarative_base() # image class class Image(Base): __tablename__ = 'images' id = Column(Integer, primary_key=True) file_name = Column(String) img_link = Column(Text) download_url = Column(Text) check_time = Column(DateTime) result = Column(String(8)) digits = relationship("Digit", backref="image") img = None # source image digits_img = None # cropped source image def __init__(self, file_name): self.file_name = file_name self.check_time = datetime.datetime.strptime(file_name, "gaz.%Y-%m-%d.%H.%M.%S.jpg") self.result = "" def __repr__(self): return "<Image ('%s','%s','%s')>" % (self.id, self.file_name, self.result) def dbDigit(self, i, digit_img): digit = sess.query(Digit).filter_by(image_id=self.id).filter_by(i=i).first() if not digit: digit = Digit(self, i, digit_img) sess.add(digit) else: digit.body = digit_img return digit ##    # digit class class Digit(Base): __tablename__ = 'digits' id = Column(Integer, primary_key=True) image_id = Column(Integer, ForeignKey("images.id")) i = Column(Integer) body = Column(PickleType) result = Column(String(1)) use_for_training = Column(Boolean) def __init__(self, image, i, digit_img): self.image_id = image.id self.i = i self.body = digit_img self.markDigitForManualRecognize() def __repr__(self): return "%s" % self.result def markDigitForManualRecognize (self, use_for_training=False): self.result = '?' self.use_for_training = use_for_training def getEncodedBody (self): enc = cv2.imencode('.png',self.body)[1] b64 = base64.b64encode(enc) return b64 ##    Base.metadata.create_all(bind=dbengine) # function to get Image object by file_name and img def getImage(file_name): image = sess.query(Image).filter_by(file_name=file_name).first() if not image: image = Image(file_name) sess.add(image) # store image object to base sess.commit() image.digits_img = None return image def getLastRecognizedImage(): return sess.query(Image).filter(Image.result!='').order_by(Image.check_time.desc()).first() def dgDigitById(digit_id): digit = sess.query(Digit).get(digit_id) return digit
      
      







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



рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдкреГрд╖реНрда рд╣реИрдВ, рдПрдХ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджрд┐рди рдпрд╛ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП:







рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдореИрдиреНрдпреБрдЕрд▓ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдкреГрд╖реНрдаред рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкрд╣рд▓реА 20-30 рд░реАрдбрд┐рдВрдЧ рдЪрд▓рд╛рдИ, рддреЛ рд░реЛрдмреЛрдЯ рдиреЗ рдЦреБрдж рдХреЛ рд░реАрдбрд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдХрднреА-рдХрднреА, рдЕрдкрд╡рд╛рдж рдЕрднреА рднреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рдирд╣реАрдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдбрд╛рдпрд▓ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ:









рдлрд┐рд░ рдЖрдкрдХреЛ рд▓рд╛рдкрддрд╛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╣рд╛рде рд╕реЗ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:



рдпрд╛ рдЖрдк рдмрд╕ рдРрд╕реЗ рд╕рдмреВрддреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд░реНрдЯ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред



рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХрдИ рд╣рд╛рд▓рд┐рдпрд╛ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рдВрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдИ-рдореЗрд▓ рднреЗрдЬреЗрдЧрд╛ред



рдЕрдЧрд░ рдореИрдВ рдЕрдВрдд рддрдХ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред



All Articles