рдирдорд╕реНрдХрд╛рд░, Habrauser!

рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдереЗред рдЙрд╕ рд╕рдордп рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЦрд┐рд▓рд╛рдбрд╝реА (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЕрдм рдХреИрд╕реЗ :) рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдзреНрд╡рдирд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рд▓рд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдкрд╛рд╡рд░рдкреИрдо рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдСрдбрд┐рдпреЛ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереАред рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЗрд╕рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо рдЖрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИред рддреЛ, рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред
рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд▓рд╛рд╢ рдореЗрдВ ...
рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмрд╣реБрдд рд╣реА рдУрдкрдирд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреЛрдЬрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдзреНрд╡рдирд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЧрд▓рддреА рд╕реЗ
SoX рд╕реЗ
рдорд┐рд▓рд╛ ред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ ...
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ
SoX рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реАрдВ:
1. рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рднреА рдкреНрд░рдореБрдЦ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди BUT ARM рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИред
2. рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдкреАрдЖрдИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд░реНрдгрди, рдХреЗрд╡рд▓ рдЕрд▓реНрдк рдерд╛, рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ред
3. SoX, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ FFmpeg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдЗрди рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ Android NDK рдХреЗ рддрд╣рдд рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред
4. SoX рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрди: рддреИрдпрд╛рд░ рдФрд░ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдСрдбрд┐рдпреЛ рдХреЛ рдпрд╛ рддреЛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ Alsa / CoreAudio рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдЦреЗрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдзреНрд╡рдирд┐ рдкреНрд░рдЬрдирди рдХреА рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рд╕рдм рдХреБрдЫ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдЬрд╛рд╡рд╛ (рдСрдбрд┐рдпреЛрдЯреНрд░реИрдХ) рдореЗрдВ рджреЗрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ ... рдореИрдВ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ :)
рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдзреНрд╡рдирд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:
assert(sox_init() == SOX_SUCCESS); assert(in = sox_open_read(argv[1], NULL, NULL, NULL)); assert(out= sox_open_write("default", &in->signal, NULL, "alsa", NULL, NULL)); chain = sox_create_effects_chain(&in->encoding, &out->encoding); e = sox_create_effect(sox_find_effect("input")); args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS); e = sox_create_effect(sox_find_effect("trim")); args[0] = "10", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS); if (in->signal.rate != out->signal.rate) { e = sox_create_effect(sox_find_effect("rate")); assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS); } if (in->signal.channels != out->signal.channels) { e = sox_create_effect(sox_find_effect("channels")); assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS); } e = sox_create_effect(sox_find_effect("output")); args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS); assert(sox_add_effect(chain, e, &in->signal, &out->signal) == SOX_SUCCESS); sox_flow_effects(chain, NULL, NULL);
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдбрд┐рдпреЛ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕рдм рдХреБрдЫ ALSA рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, effect_chain рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ 2 рд╕реНрдЯреНрд░реАрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред рдпрд╣рд╛рдБ рдПрдХ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рднрд╛рдЧреЛрдВ рдореЗрдВ рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
assert(sox_init() == SOX_SUCCESS); assert(in = sox_open_read(argv[1], NULL, NULL, NULL)); #if defined FIXED_BUFFER assert(out = sox_open_mem_write(buffer, buffer_size, &in->signal, NULL, "sox", NULL)); #else assert(out = sox_open_memstream_write(&buffer, &buffer_size, &in->signal, NULL, "sox", NULL)); #endif while ((number_read = sox_read(in, samples, MAX_SAMPLES))) assert(sox_write(out, samples, number_read) == number_read);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдСрдбрд┐рдпреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбреАрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рдмрдлрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИ (рдЬреЛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реАрдб рдПрдВрдб рд░рд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ (рдЖрдХрд╛рд░ рдореЗрдВ 16484 рдмрд╛рдЗрдЯреНрд╕) рдФрд░ рдлрд┐рд░ рдЗрди рдзрд╛рд░рд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╡рд╕рд░ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рддрдм рд╕рднреА рдСрдбрд┐рдпреЛ рдХреЛ рдПрдХ рдмрдлрд░ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдХреЛрдб рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ (рдЬрдм рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдХрд┐ 10-11 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреА рдПрдХ рдЫреЛрдЯреА рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ 100 рдПрдордмреА рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ...
рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВрдиреЗ SoX рдФрд░ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред Android NDK рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рд╕рдордп рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреЛрд░реНрдЯрд┐рдВрдЧ рдПрдХ рдЬрдЯрд┐рд▓, рд╕рдЬрд╛рддреАрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдереА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕реЗ FFmpeg)ред рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рд╕рдВрдХрд▓рд┐рдд sox.so рдорд┐рд▓рд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдФрд░ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ :) рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред 3. рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ - рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛ рдЬреЛ рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрдлрд░ рднрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдЦреЗрд▓рддрд╛ рд╣реИред рдореЗрдореЛрд░реА рд╕рдорд╕реНрдпрд╛ рд▓рдЧрднрдЧ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕реЗ рдбреНрд░реЙрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдореБрдЭреЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╕рднреА рдСрдбрд┐рдпреЛ рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдкреНрд▓реЗ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЗрдлреЗрдХреНрдЯреНрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЕрдм рдлреНрд▓реЗрдВрдЬрд░, рдЖрдк рдХреЛрдИ рдЕрдиреНрдп рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред рдПрдХ рдУрд░, рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдирдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реАрдВ:
1. рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп 80% рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ)ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рд╕реА рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╣рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
2. рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрд╕реНрдерд┐рд░ рд╣реИред 10 рдореЗрдВ рд╕реЗ 1-2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЗрд▓рддрд╛ рд╣реИ (рдЧреИрд▓реЗрдХреНрд╕реА рдЯреИрдм рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛)ред рдореИрдВ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ ...
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рддрд╛рдХрд┐ рдХрд╛рдо рдЧрд╛рдпрдм рди рд╣реЛ, рдореИрдВрдиреЗ GitHub рдкрд░ рд╕рднреА рдХреЛрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред рдЕрдЧрд░ рдХреЛрдИ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рджреЗрдЦрддрд╛ рд╣реИ - рдореБрдЭреЗ рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдпрд╛ рдкреАрдПрдо рдХреЛ рд▓рд┐рдЦреЗрдВред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рд╕реА рдХреЛ рднреА рд░реБрдЪрд┐рдХрд░ рд▓рдЧреЗрдЧрд╛ :)