рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд╕рд╛рде рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдкрд░ рд╕реНрдХреВрд▓ рдХреА рдШрдВрдЯреА

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

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреВрд▓ рдХреА рдШрдВрдЯреА рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдЬрдЧрд╣ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдбреЗрд╡рд▓рдкрд░ рдиреЗ 5-7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдЬрдм рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

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

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

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


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

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



рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рд╡рд┐рддрд░рдг рдХрд┐рдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рд╕рдордп рдХреНрд╖реЗрддреНрд░, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рд╕реЗ рднрд░рд╛ рд╣реИред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдШрдбрд╝реА


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



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

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

/ usr / рд╕реНрдерд╛рдиреАрдп / рдмрд┐рди / update_rtc
#!/bin/bash LOG="/var/log/rtc-sync.log" DATE=`date` sleep 30 echo "*** $DATE" >>$LOG until ping -nq -c3 8.8.8.8; do echo "No network, updating system clock from RTC." >>$LOG rtc-pi 2>&1 exit done echo "Network detected. Updating RTC." >>$LOG date +%Y%m%d%H%M%S |xargs ./rtc-pi 2>&1 


/etc/init.d/rtc
 #!/bin/sh # /etc/init.d/rtc ### BEGIN INIT INFO # Provides: RTC controll # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Simple script to start RTC sync # Description: A simple script from prostosergik <serge.liskovsky@gmail.com> which will run script that synchronizes RTC module clock with system clock at startup. ### END INIT INFO case "$1" in start) echo "RTC sync..." /usr/local/bin/update_rtc& 2>&1 ;; stop) echo "Stopping RTC Sync..." # kill application you want to stop killall update_rtc ;; *) echo "Usage: /etc/init.d/rtc {start|stop}" exit 1 ;; esac exit 0 


... рдФрд░ рдСрдЯреЛрд▓реЛрдб рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ:
 sudo update-rc.d rtc defaults 


рдпрджрд┐ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХреЛрдИ рдиреЗрдЯрд╡рд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ RTC рдореЗрдВ рд╕рдордп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпреЗ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдЖрдкрдХреЛ рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╕рд┐рд╕реНрдЯрдо рдХреНрд▓реЙрдХ рдХреЛ RTC рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдмреВрдЯ ntpd рдХреЗ 30 рд╕реЗрдХрдВрдб рдмрд╛рдж рд╕рд┐рд╕реНрдЯрдо рдШрдбрд╝реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрд░рдЯреАрд╕реА рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ рдХрд┐ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдХреЛ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмреЗрд╣рддрд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдХрд┐ рд╣рд░ 2-3 рдШрдВрдЯреЗ рдореЗрдВ рдЖрд░рдЯреАрд╕реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдХреБрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдирд╛, рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕рдЯреАрдХ рдбреЗрдЯрд╛ рд╣реИрдВред рдпрджрд┐ рд╕рдореНрдорд╛рдирд┐рдд рд╕рдореБрджрд╛рдп рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдмрддрд╛рдПрдЧрд╛ - рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╡реЗрдм рд╕рд░реНрд╡рд░


рдмрд╣реБрдд рджреЗрд░ рддрдХ рдХреБрдЫ рд╕реЛрдЪрд╛ рдирд╣реАрдВ рдерд╛ред рд╕рд░реНрд╡рд░ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рджреЛ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ POST рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдЖрддреНрдо-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣реИред

webserver.py
 #!/usr/bin/python # -*- coding: utf-8 -*- import cgi, re, json from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import collections from config import * class MainRequestHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == '/': lessons = readSchedule() schedule = '' for lesson in lessons: schedule += u"<b> "+lesson+"</b>: "+lessons[lesson].get('start', '--:--') + " - " + lessons[lesson].get('end', '--:--') + "<br />" data = { 'schedule': schedule.encode('utf-8') } TemplateOut(self, 'index.html', data) return elif self.path == '/form.html': lessons = readSchedule() form = '' for lesson in lessons: form += u"<div class='form_block'><label> "+lesson+"</label> <input type='text' name='lesson_"+lesson+"_start' value='"+lessons[lesson].get('start', '--:--') + "'> - <input type='text' name='lesson_"+lesson+"_end' value='"+lessons[lesson].get('end', '--:--') + "'> </div> """ data = { 'form': form.encode('utf-8') } TemplateOut(self, 'form.html', data) return elif self.path == '/remote.html': lessons = readScheduleRemote() form = '' for lesson in lessons: form += u"<div class='form_block'><label> "+lesson+"</label> <input type='text' name='lesson_"+lesson+"_start' value='"+lessons[lesson].get('start', '--:--') + "'> - <input type='text' name='lesson_"+lesson+"_end' value='"+lessons[lesson].get('end', '--:--') + "'> </div> """ data = { 'form': form.encode('utf-8') } TemplateOut(self, 'form.html', data) return else: try: TemplateOut(self, self.path) except IOError: self.send_error(404, 'File Not Found: %s' % self.path) def do_POST(self): # Parse the form data posted form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={ 'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], } ) lessons = {} if self.path.endswith('save'): # Echo back information about what was posted in the form for field in form.keys(): field_item = form[field] if type(field_item) == type([]): pass # no arrays processing now else: if field_item.filename: pass #no files now. else: if re.match('lesson_([\d]+)_(start|end)', field): (lesson, state) = re.findall('lesson_([\d]+)_(start|end)', field)[0] try: lessons[lesson] except Exception: lessons[lesson] = {} lessons[lesson][state] = field_item.value # printlessons json_s = json.dumps(lessons) if json_s: try: f = open(JSON_FILE, 'w+') f.write(json_s) f.close() HTMLOut(self, 'Saved OK.' + JS_REDIRECT) except IOError, e: # raise e HTMLOut(self, 'Error saving. IO error. '+e.message) else: HTMLOut(self, 'Json Error.') else: self.send_error(404, 'Wrong POST url: %s' % self.path) return def Redirect(request, location): request.send_response(301) request.send_header('Location', location) request.end_headers() return def Headers200(request): request.send_response(200) request.send_header('Content-type', 'text/html') request.end_headers() return def TemplateOut(request, out_file, data = {}): f = open(SCRIPT_DIR + out_file) out = f.read() f.close() #tiny template engine for key, var in data.items(): out = out.replace("{{"+key+"}}", var) HTMLOut(request, out) def HTMLOut(request, html): Headers200(request) f = open(SCRIPT_DIR + 'base.html') out = f.read() f.close() out = out.replace("{{content}}", html) request.wfile.write(out) def readSchedule(): try: f = open(JSON_FILE, 'r') json_s = f.read() f.close() except IOError: return [] try: lessons = json.loads(json_s) except Exception: return [] lessons = collections.OrderedDict(sorted(lessons.items())) return lessons def readScheduleRemote(): import urllib2 try: response = urllib2.urlopen(REMOTE_URL) json_s = response.read() except Exception: return [] try: lessons = json.loads(json_s) except Exception: return [] lessons = collections.OrderedDict(sorted(lessons.items())) return lessons def main(): try: server = HTTPServer(('', 8088), MainRequestHandler) print 'Started httpserver...' server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server.' server.socket.close() if __name__ == '__main__': main() 


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

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

рджрд░рдЕрд╕рд▓, рд╕реНрдХреВрд▓ рдХреЗ рдмреЗрд▓ рдореИрдиреЗрдЬрд░


рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд GPIO рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдПрд▓рдИрдбреА рдХреЗ рд╕рд╛рде рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╕реЗ рдПрдХ рд╕реНрдХреВрд▓ рдХреА рдШрдВрдЯреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрд╕рд╛ рдХрд░рддреА рд╣реИ:

daemon.py
 #!/usr/bin/python # -*- coding: utf-8 -*- import time import threading import json import RPi.GPIO as GPIO from config import * GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(25, GPIO.OUT) GPIO.output(25, False) def read_schedule(): schedule = [] try: f = open(JSON_FILE, 'r') json_s = f.read() f.close() try: json_data = json.loads(json_s) except Exception, e: json_data = [] for lesson in json_data.values(): start = lesson.get('start', False) end = lesson.get('end', False) if start is not False: # print start.split(":") (s_h, s_m) = start.split(":") schedule.append({'h': int(s_h), 'm':int(s_m)}) del s_h del s_m if end is not False: (e_h, e_m) = end.split(":") schedule.append({'h': int(e_h), 'm':int(e_m)}) del e_h del e_m return schedule # schedule except IOError, e: return [] except Exception, e: return [] class Alarm(threading.Thread): def __init__(self): super(Alarm, self).__init__() self.schedule = read_schedule() self.keep_running = True def run(self): try: while self.keep_running: now = time.localtime() for schedule_item in self.schedule: if now.tm_hour == schedule_item['h'] and now.tm_min == schedule_item['m']: print "Ring start..." GPIO.output(25, True) time.sleep(5) print "Ring end..." GPIO.output(25, False) self.schedule = read_schedule() #reload schedule if it was changed time.sleep(55) # more than 1 minute #print "Check at "+str(now.tm_hour)+':'+str(now.tm_min)+':'+str(now.tm_sec) time.sleep(1) except Exception, e: raise e # return def die(self): self.keep_running = False alarm = Alarm() def main(): try: alarm.start() print 'Started daemon...' while True: continue except KeyboardInterrupt: print '^C received, shutting down daemon.' alarm.die() if __name__ == '__main__': main() 


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

рдПрдХ рдХреБрддреНрддреЗ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ


рдЖрд░рдЯреАрд╕реА рдСрдЯреЛрд░рди рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:

/etc/init.d/schedule_daemon
 #!/bin/sh ### BEGIN INIT INFO # Provides: schedule_daemon # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # description: School Ring Schedule daemon # processname: School Ring Schedule daemon ### END INIT INFO export SCHEDULE_ROOT=/home/pi/ring_app export PATH=$PATH:$SCHEDULE_ROOT SERVICE_PID=`ps -ef | grep daemon.py | grep -v grep | awk 'END{print $2}'` usage() { echo "service schedule_daemon {start|stop|status}" exit 0 } case $1 in start) if [ $SERVICE_PID ];then echo "Service is already running. PID: $SERVICE_PID" else $SCHEDULE_ROOT/daemon.py& 2>&1 fi ;; stop) if [ $SERVICE_PID ];then kill -9 $SERVICE_PID else echo "Service is not running" fi ;; status) if [ $SERVICE_PID ];then echo "Running. PID: $SERVICE_PID" else echo "Not running" fi ;; *) usage ;; esac 


/etc/init.d/schedule_webserver
 #!/bin/sh ### BEGIN INIT INFO # Provides: schedule_webserver # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # description: School Ring Schedule web-server # processname: School Ring Schedule web-server ### END INIT INFO export SCHEDULE_ROOT=/home/pi/ring_app export PATH=$PATH:$SCHEDULE_ROOT SERVICE_PID=`ps -ef | grep webserver.py | grep -v grep | awk 'END{print $2}'` usage() { echo "service schedule_webserver {start|stop|status}" exit 0 } case $1 in start) if [ $SERVICE_PID ];then echo "Service is already running. PID: $SERVICE_PID" else $SCHEDULE_ROOT/webserver.py& 2>&1 fi ;; stop) if [ $SERVICE_PID ];then kill -9 $SERVICE_PID else echo "Service is not running" fi ;; status) if [ $SERVICE_PID ];then echo "Running. PID: $SERVICE_PID" else echo "Not running" fi ;; *) usage ;; esac 



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

/etc/init.d/schedule_daemon_wd
 #!/bin/sh ### BEGIN INIT INFO # Provides: schedule_daemon_wd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # description: School Ring Schedule daemon watchdog # processname: School Ring Schedule daemon watchdog ### END INIT INFO export SCHEDULE_ROOT=/home/pi/ring_app export PATH=$PATH:$SCHEDULE_ROOT SERVICE_PID=`ps -ef | grep daemon.py | grep -v grep | awk '{print $2}'` check_service() { if [ -z $SERVICE_PID ];then service schedule_daemon start fi } check_service usage() { echo "schedule_daemon_wd {start|stop|status}" exit 0 } case $1 in start ) if [ $SERVICE_PID ];then echo "schedule_daemon is already running. PID: $SERVICE_PID" else service schedule_daemon start fi ;; stop ) if [ $SERVICE_PID ];then service schedule_daemon stop else echo "schedule_daemon is already stopped" fi ;; status) if [ $SERVICE_PID ];then echo "schedule_daemon is running. PID: $SERVICE_PID" else echo "schedule_daemon is not running" fi ;; *) usage ;; esac 


/etc/init.d/schedule_webserver_wd
 #!/bin/sh ### BEGIN INIT INFO # Provides: schedule_webserver_wd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # description: School Ring Schedule web-server watchdog # processname: School Ring Schedule web-server watchdog ### END INIT INFO export SCHEDULE_ROOT=/home/pi/ring_app export PATH=$PATH:$SCHEDULE_ROOT SERVICE_PID=`ps -ef | grep webserver.py | grep -v grep | awk '{print $2}'` check_service() { if [ -z $SERVICE_PID ];then service schedule_webserver start fi } check_service usage() { echo "schedule_webserver_wd {start|stop|status}" exit 0 } case $1 in start ) if [ $SERVICE_PID ];then echo "schedule_webserver is already running. PID: $SERVICE_PID" else service schedule_webserver start fi ;; stop ) if [ $SERVICE_PID ];then service schedule_webserver stop else echo "schedule_webserver is already stopped" fi ;; status) if [ $SERVICE_PID ];then echo "schedule_webserver is running. PID: $SERVICE_PID" else echo "schedule_webserver is not running" fi ;; *) usage ;; esac 


рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:

 sudo update-rc.d schedule_daemon_wd defaults sudo update-rc.d schedule_webserver_wd defaults 

рдФрд░ рдореБрдХреБрдЯ рдореЗрдВ рдирдП рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗрдВ:

/etc/cron.d/wd.cron
 #Watchdog tasks * * * * * /etc/init.d/schedule_daemon_wd * * * * * /etc/init.d/schedule_webserver_wd 


рдЕрдм рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рд░рд╛рдХреНрд╖рд╕реЛрдВ рдиреЗ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред Wd.cron рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдИ рд▓рд╛рдЗрди рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рдХреНрд░реЛрди рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдВрдЧреЗ!

рдкрд╛рд╡рд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


рдкреВрд░реА рдмрд┐рдЬрд▓реА рдЗрдХрд╛рдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рд╣реИред рд╕реНрдХреВрд▓ рдореЗрдВ рдХреЙрд▓ рдХреА рдХреБрд▓ рд╢рдХреНрддрд┐ рд▓рдЧрднрдЧ 0.5 рдХрд┐рд▓реЛрд╡рд╛рдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП MOC3061 рдСрдкреНрдЯреЛрдХреЙрдкрд▓рд░ рдХреЗ рд╕рд╛рде рдпреБрдЧреНрдорд┐рдд BC137X triac рдЗрд╕ рдЦреЗрдд рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдПрдХ рдСрдкреНрдЯреЛрдХреЛрдкреНрд▓рд░ рдХреЗ рдЖрд╢реНрд╡рд╕реНрдд рд╕рдорд╛рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдЗрдХрд╛рдИ рдХрд╛ 3.3 рд╡реЛрд▓реНрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


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

рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИ


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ , рд╕реБрд░рдХреНрд╖рд╛ред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTTP-Auth рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛, рдпрд╛, рдереЛрдбрд╝реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдХреЗ "рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВред рд╣рд╛рдВ, рдФрд░ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рджреВрд╕рд░реЗ , рдЖрдкрдХреЛ рд╢рд┐рдХреНрд╖рд╛рд╡рд┐рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдШрдВрдЯреЗ рдЖрдХрд╛рд░ рдореЗрдВред рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдлрд╝реАрд▓реНрдб рдкрд░ рдлрд╝реЙрд░реНрдо рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдбред
рддреАрд╕рд░рд╛ , рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ "рдкреИрдирд┐рдХ рдмрдЯрди" рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ 5-10 рд╕реЗрдХрдВрдб рдореЗрдВ рдХреЙрд▓ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ред рдкрд╛рдардХреЛрдВ рдХреЗ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдорди рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рдо рд╣реИ, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд▓реЗрдЦ рдореЗрдВ рд╣реИред
рдЪреМрдерд╛ , рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рд░реНрдмрд╛рдз рдмрд┐рдЬрд▓реА рдЖрдкреВрд░реНрддрд┐ рдЗрдХрд╛рдИ рдирд╣реАрдВ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдХрднреА рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рдкрд╣реБрдБрдЪреЗред

рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ


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

рдЕрдВрддрднрд╛рд╖рдг


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

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

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

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


All Articles