{"id":261926,"date":"2015-07-21T10:04:02","date_gmt":"2015-07-21T06:04:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=261926"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=261926","title":{"rendered":"\u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0441 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438"},"content":{"rendered":"<p>       <i>\u042d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0431\u043b\u043e\u0433\u043f\u043e\u0441\u0442\u0430 \u0421\u0430\u0443 \u0428\u043e\u043d \u0427\u0430\u043d\u0433\u0430. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u043d\u0430 \u0413\u043e, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430 \u0441\u0447\u0451\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 (\u043a\u0430\u043d\u0430\u043b\u044b, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b).<br \/>  \u041f\u043e \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044f\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043b\u0438\u0447\u043a\u0443.<\/i><\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u043e\u0439 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0434\u0440\u0443\u0433 <a href=\"https:\/\/twitter.com\/indianguru\">\u0421\u0430\u0442\u0438\u0448 \u0422\u0430\u043b\u0438\u043c<\/a> \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0438\u0434\u0435\u044e \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0413\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \u0413\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446 (\u0438\u043b\u0438 \u043e\u043a\u043e\u043b\u043e \u0442\u043e\u0433\u043e) \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u0440\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0413\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043f\u0440\u0438\u0437\u044b, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043c\u043e\u0447\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0438 \u0441\u0435\u0431\u0435 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0421\u0430\u0442\u0438\u0448 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0438 \u044f \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0434\u043b\u044f <a href=\"http:\/\/golang-challenge.com\/go-challenge3\/\">\u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f<\/a> (challenge #3).<\/p>\n<p>  \u0411\u0443\u0434\u0443\u0447\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0435\u0439 \u043a\u0430\u0440\u044c\u0435\u0440\u044b, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043d\u0430 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0435, <a href=\"https:\/\/developer.yahoo.com\/blogs\/ydn\/creating-photo-mosaics-yahoo-boss-image-search-7453.html\">\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0420\u0443\u0431\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0437\u0430\u0438\u043a\u0438<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0438\u0434\u0435\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bc3\/3df\/49c\/bc33df49c36546acac8155694b2ef4f5.png\"\/><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0451 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e. \u042f \u043d\u0430\u0447\u0430\u043b \u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u043e\u0441\u044c. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0437\u0430\u043d\u044f\u043b\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445 \u0434\u043d\u0435\u0439. \u041d\u043e \u043e\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0432 \u0413\u043e \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u043e\u0442 \u0431\u043b\u043e\u0433\u043f\u043e\u0441\u0442 \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b.<\/p>\n<p>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/sausheong\/mosaic\">github.com\/sausheong\/mosaic<\/a>. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0438\u0436\u0435.<\/p>\n<p>  \u0414\u0435\u043c\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"http:\/\/mosaic.saush.com\">mosaic.saush.com<\/a>. <i>(\u041f\u0440\u0438\u043c. \u043f\u0435\u0440. \u2014 \u043d\u0435 \u043f\u0443\u0433\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438, \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043b\u0430\u0431\u0435\u043d\u044c\u043a\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u043e \u043e\u0445\u043e\u0442\u043d\u043e \u0432\u0430\u043b\u0438\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0445 \u0432 4 \u041c\u0411).<\/i> \u041e\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0430 \u043d\u0430 Digital Ocean \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Docker \u0447\u0435\u0440\u0435\u0437 Tutum. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043c\u043a\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0432\u044b\u0441\u043e\u043a\u0430 \u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u0438\u0448\u044c 1 CPU VM \u0438 512 \u041c\u0411.<\/p>\n<h1>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0443.<\/h1>\n<p>  \u0424\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0438\u043b\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0430 \u2014 \u044d\u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430), \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0437\u0434\u0430\u043b\u0435\u043a\u0430 \u0438\u043b\u0438 \u043f\u0440\u0438\u0449\u0443\u0440\u0438\u0442\u044c\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u043b\u0438\u0436\u0435, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043e\u0442\u0435\u043d \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0442\u044b\u0441\u044f\u0447 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043f\u043b\u0438\u0442\u043e\u043a-\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a.<\/p>\n<p>  \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435, \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043b, \u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0438\u043c\u0435\u044e\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438. \u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0445\u044d\u0448 \u043f\u043b\u0438\u0442\u043e\u043a, \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438. \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u2014 \u044d\u0442\u043e \u043a\u043b\u044e\u0447, \u0430 \u0443\u0441\u0440\u0435\u0434\u043d\u0451\u043d\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u0438\u0437 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043a\u0440\u0430\u0441\u043d\u044b\u0439, \u0437\u0435\u043b\u0451\u043d\u044b\u0439, \u0441\u0438\u043d\u0438\u0439 (RGB), \u2014 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0440\u0430\u0441\u043d\u044b\u0445, \u0437\u0435\u043b\u0451\u043d\u044b\u0445 \u0438 \u0441\u0438\u043d\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. <i>(\u041f\u0440\u0438\u043c. \u043f\u0435\u0440. \u2014 \u0430\u0432\u0442\u043e\u0440 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d tuple, \u043d\u043e \u0432 \u0413\u043e \u043d\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445, \u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043f\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c. \u041d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u0430\u0439\u0441\u0430\u043c\u0438).<\/i><\/li>\n<li>\u0420\u0430\u0437\u0440\u0435\u0437\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043f\u043b\u0438\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0446\u0432\u0435\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0446\u0432\u0435\u0442 \u0432\u0441\u0435\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.<\/li>\n<li>\u0418\u0449\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043f\u043b\u0438\u0442\u043a\u0443 \u0438\u0437 \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0435 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0444\u043e\u0442\u043e\u043c\u0430\u0437\u0430\u0438\u043a\u0435. \u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0446\u0432\u0435\u0442\u0430\u043c\u0438 [3]\u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 [3]\u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u0432 \u0442\u043e\u0447\u043a\u0443 \u0432 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/li>\n<li>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0438\u0442\u043a\u0438 \u0438\u0437 \u0411\u0414, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043f\u043b\u0438\u0442\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<\/li>\n<\/ol>\n<p>  \u042f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0432\u0435\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 mosaic.go. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"go\">\/\/ \u0438\u0449\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0446\u0432\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 func averageColor(img image.Image) [3]float64 {     bounds := img.Bounds()     r, g, b := 0.0, 0.0, 0.0     for y := bounds.Min.Y; y &lt; bounds.Max.Y; y++ {         for x := bounds.Min.X; x &lt; bounds.Max.X; x++ {             r1, g1, b1, _ := img.At(x, y).RGBA()             r, g, b = r+float64(r1), g+float64(g1), b+float64(b1)         }     }     totalPixels := float64(bounds.Max.X * bounds.Max.Y)     return [3]float64{r \/ totalPixels, g \/ totalPixels, b \/ totalPixels} } <\/code><\/pre>\n<p>  \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>averageColor<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0440\u0430\u0441\u043d\u044b\u0445, \u0437\u0435\u043b\u0451\u043d\u044b\u0445 \u0438 \u0441\u0438\u043d\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 (\u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438) \u0438 \u0434\u0435\u043b\u0438\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c [3]\u043a\u043e\u0440\u0442\u0435\u0436 (\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 (<b>resize<\/b>)<\/p>\n<pre><code class=\"go\">\/\/ \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 newWidth func resize(in image.Image, newWidth int) image.NRGBA {     bounds := in.Bounds()     width := bounds.Max.X - bounds.Min.X     ratio := width \/ newWidth     out := image.NewNRGBA(image.Rect(bounds.Min.X\/ratio, bounds.Min.X\/ratio, bounds.Max.X\/ratio, bounds.Max.Y\/ratio))     for y, j := bounds.Min.Y, bounds.Min.Y; y &lt; bounds.Max.Y; y, j = y+ratio, j+1 {         for x, i := bounds.Min.X, bounds.Min.X; x &lt; bounds.Max.X; x, i = x+ratio, i+1 {             r, g, b, a := in.At(x, y).RGBA()             out.SetNRGBA(i, j, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})         }     }     return *out } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>tilesDB<\/b> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<pre><code class=\"go\">\/\/ \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c tilesDB \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 func tilesDB() map[string][3]float64 {     fmt.Println(&quot;Start populating tiles db ...&quot;)     db := make(map[string][3]float64)     files, _ := ioutil.ReadDir(&quot;tiles&quot;)     for _, f := range files {         name := &quot;tiles\/&quot; + f.Name()         file, err := os.Open(name)         if err == nil {             img, _, err := image.Decode(file)             if err == nil {                 db[name] = averageColor(img)             } else {                 fmt.Println(&quot;:&quot;, err, name)             }         } else {             fmt.Println(&quot;cannot open file&quot;, name, err)         }         file.Close()     }     fmt.Println(&quot;Finished populating tiles db.&quot;)     return db } <\/code><\/pre>\n<p>  \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a \u2014 \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432 \u043a\u043b\u044e\u0447\u0435 \u0438 [3]\u043a\u043e\u0440\u0442\u0435\u0436\u0435\u043c (\u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0442\u0440\u0451\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438. \u042f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0446\u0432\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e nearest, \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0446\u0432\u0435\u0442\u0430 [3]\u043a\u043e\u0440\u0442\u0435\u0436\u0430.<\/p>\n<pre><code class=\"go\">\/\/ \u0438\u0449\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 func nearest(target [3]float64, db *map[string][3]float64) string {     var filename string     smallest := 1000000.0     for k, v := range *db {         dist := distance(target, v)         if dist &lt; smallest {             filename, smallest = k, dist         }     }     delete(*db, filename)     return filename } <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0411\u0414 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u0430\u043c\u0438, \u0437\u0430\u0442\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043f\u043b\u0438\u0442\u043a\u0430. \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0411\u0414. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <b>distance<\/b> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f [3]\u043a\u043e\u0440\u0442\u0435\u0436\u0430\u043c\u0438.<\/p>\n<pre><code class=\"go\">\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 func distance(p1 [3]float64, p2 [3]float64) float64 {     return math.Sqrt(sq(p2[0]-p1[0]) + sq(p2[1]-p1[1]) + sq(p2[2]-p1[2])) }   \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 func sq(n float64) float64 {     return n * n } <\/code><\/pre>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0435\u0443\u043a\u043b\u044e\u0436\u0435. \u042f \u0445\u043e\u0447\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0430\u0436\u0434\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0411\u0414 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a. \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a <b>TILESDB<\/b> \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"go\">var TILESDB map[string][3]float64   \/\/ \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 func cloneTilesDB() map[string][3]float64 {     db := make(map[string][3]float64)     for k, v := range TILESDB {         db[k] = v     }     return db } <\/code><\/pre>\n<p>  <\/p>\n<h1>\u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438<\/h1>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043c\u043e\u0435\u0433\u043e \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <b>main.go<\/b>.<\/p>\n<pre><code class=\"go\">package main   import (     &quot;fmt&quot;     &quot;html\/template&quot;     &quot;net\/http&quot;     &quot;bytes&quot;     &quot;encoding\/base64&quot;     &quot;image&quot;     &quot;image\/draw&quot;     &quot;image\/jpeg&quot;     &quot;os&quot;     &quot;strconv&quot; )   func main() {     mux := http.NewServeMux()     files := http.FileServer(http.Dir(&quot;public&quot;))     mux.Handle(&quot;\/static\/&quot;, http.StripPrefix(&quot;\/static\/&quot;, files))     mux.HandleFunc(&quot;\/&quot;, upload)     mux.HandleFunc(&quot;\/mosaic &quot;, mosaic)     server := &http.Server{         Addr:    &quot;127.0.0.1:8080&quot;,         Handler: mux,     } \/\/ \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a     TILESDB = tilesDB()     fmt.Println(&quot;Mosaic server started.&quot;)     server.ListenAndServe() }   \/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 func upload(w http.ResponseWriter, r *http.Request) {     t, _ := template.ParseFiles(&quot;upload.html&quot;)     t.Execute(w, nil) }   \/\/ HandlerFunc mosaic \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 func mosaic(w http.ResponseWriter, r *http.Request) {     t0 := time.Now()     \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 POST \u0444\u043e\u0440\u043c\u044b     r.ParseMultipartForm(10485760) \/\/ max body in memory is 10MB     file, _, _ := r.FormFile(&quot;image&quot;)     defer file.Close()     tileSize, _ := strconv.Atoi(r.FormValue(&quot;tile_size&quot;))     \/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     original, _, _ := image.Decode(file)     bounds := original.Bounds()     \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0438     newimage := image.NewNRGBA(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, bounds.Max.Y))     \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043b\u0438\u0442\u043e\u0447\u043d\u043e\u0439 \u0411\u0414     db := cloneTilesDB()     \/\/ source point \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 0, 0 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0438\u0442\u043a\u0438     sp := image.Point{0, 0}     for y := bounds.Min.Y; y &lt; bounds.Max.Y; y = y + tileSize {         for x := bounds.Min.X; x &lt; bounds.Max.X; x = x + tileSize {             \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043a\u0430\u043a \u0443\u0441\u0440\u0435\u0434\u043d\u0451\u043d\u043d\u044b\u0439 \u0446\u0432\u0435\u0442             r, g, b, _ := original.At(x, y).RGBA()             color := [3]float64{float64(r), float64(g), float64(b)}             \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 \u0438\u0437 \u0411\u0414             nearest := nearest(color, &db)             file, err := os.Open(nearest)             if err == nil {                 img, _, err := image.Decode(file)                 if err == nil {                     \/\/ \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u043b\u0438\u0442\u043a\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u044f\u043c                     t := resize(img, tileSize)                     tile := t.SubImage(t.Bounds())                     tileBounds := image.Rect(x, y, x+tileSize, y+tileSize)                     \/\/ \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043b\u0438\u0442\u043a\u0438 \u0432 \u043c\u043e\u0437\u0430\u0438\u043a\u0435                     draw.Draw(newimage, tileBounds, tile, sp, draw.Src)                 } else {                     fmt.Println(&quot;error:&quot;, err, nearest)                 }             } else {                 fmt.Println(&quot;error:&quot;, nearest)             }             file.Close()         }     }       buf1 := new(bytes.Buffer)     jpeg.Encode(buf1, original, nil)     originalStr := base64.StdEncoding.EncodeToString(buf1.Bytes())       buf2 := new(bytes.Buffer)     jpeg.Encode(buf2, newimage, nil)     mosaic := base64.StdEncoding.EncodeToString(buf2.Bytes())     t1 := time.Now()     images := map[string]string{         &quot;original&quot;: originalStr,         &quot;mosaic&quot;:   mosaic,         &quot;duration&quot;: fmt.Sprintf(&quot;%v &quot;, t1.Sub(t0)),     }     t, _ := template.ParseFiles(&quot;results.html&quot;)     t.Execute(w, images) } <\/code><\/pre>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>mosaic<\/b> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0435\u043d\u0434\u043b\u0435\u0440\u043e\u043c. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0438\u0442\u043e\u043a \u0438\u0437 \u0444\u043e\u0440\u043c\u044b.<\/p>\n<pre><code class=\"go\">\/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 POST \u0444\u043e\u0440\u043c\u044b r.ParseMultipartForm(10485760) \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 10 \u041c\u0411 file, _, _ := r.FormFile(&quot;image&quot;) defer file.Close() tileSize, _ := strconv.Atoi(r.FormValue(&quot;tile_size&quot;)) <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u044e \u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438.<\/p>\n<pre><code class=\"go\">\/\/ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f original, _, _ := image.Decode(file) bounds := original.Bounds() \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0438 newimage := image.NewNRGBA(image.Rect(bounds.Min.X, bounds.Min.Y, bounds.Max.X, bounds.Max.Y)) <\/code><\/pre>\n<p>  \u0415\u0449\u0451 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0411\u0414 \u043f\u043b\u0438\u0442\u043e\u043a \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 (\u043d\u0443\u0436\u043d\u043e \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"http:\/\/golang.org\/pkg\/image\/draw\/\">image\/draw<\/a>)<\/p>\n<pre><code class=\"go\">\/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043b\u0438\u0442\u043e\u0447\u043d\u043e\u0439 \u0411\u0414 db := cloneTilesDB() \/\/ source point \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 0, 0 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 sp := image.Point{0, 0} <\/code><\/pre>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u043b\u0438\u0442\u043a\u0430\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/p>\n<pre><code class=\"go\"> for y := bounds.Min.Y; y &lt; bounds.Max.Y; y = y + tileSize { \tfor x := bounds.Min.X; x &lt; bounds.Max.X; x = x + tileSize { \t\t\/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043a\u0430\u043a \u0443\u0441\u0440\u0435\u0434\u043d\u0451\u043d\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \t\tr, g, b, _ := original.At(x, y).RGBA() \t\tcolor := [3]float64{float64(r), float64(g), float64(b)} \t\t\/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043f\u043b\u0438\u0442\u043a\u0438 \u0438\u0437 \u0411\u0414 \t\tnearest := nearest(color, &db) \t\tfile, err := os.Open(nearest) \t\tif err == nil { \t\t\timg, _, err := image.Decode(file) \t\t\tif err == nil { \t\t\t\t\/\/ \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u043b\u0438\u0442\u043a\u0438 \u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u044f\u043c \t\t\t\tt := resize(img, tileSize) \t\t\t\ttile := t.SubImage(t.Bounds()) \t\t\t\ttileBounds := image.Rect(x, y, x+tileSize, y+tileSize) \t\t\t\t\/\/ \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043b\u0438\u0442\u043a\u0438 \u0432 \u043c\u043e\u0437\u0430\u0438\u043a\u0435 \t\t\t\tdraw.Draw(newimage, tileBounds, tile, sp, draw.Src) \t\t\t} else { \t\t\t\tfmt.Println(&quot;error:&quot;, err, nearest) \t\t\t} \t\t} else { \t\t\tfmt.Println(&quot;error:&quot;, nearest) \t\t} \t\tfile.Close() \t} } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438 \u0440\u0435\u0448\u0430\u0435\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u0443\u0441\u0440\u0435\u0434\u043d\u0451\u043d\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0441\u0435\u043a\u0446\u0438\u0438. \u0414\u0430\u043b\u0435\u0435 \u0438\u0449\u0435\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043f\u043e \u0446\u0432\u0435\u0442\u0443 \u043f\u043b\u0438\u0442\u043a\u0443 \u0432 \u0411\u0414. \u041f\u043b\u0438\u0442\u043e\u0447\u043d\u0430\u044f \u0411\u0414 \u0432\u044b\u0434\u0430\u0451\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043f\u043b\u0438\u0442\u043a\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0440\u0430\u043d\u0435\u0435 \u043c\u043e\u0437\u0430\u0438\u043a\u0443 (newimage).<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430, \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e \u0435\u0433\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JPEG, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e \u0435\u0433\u043e \u0432 base64 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<pre><code class=\"go\">buf1 := new(bytes.Buffer) jpeg.Encode(buf1, original, nil) originalStr := base64.StdEncoding.EncodeToString(buf1.Bytes())   buf2 := new(bytes.Buffer) jpeg.Encode(buf2, newimage, nil) mosaic := base64.StdEncoding.EncodeToString(buf2.Bytes()) t1 := time.Now() images := map[string]string{     &quot;original&quot;: originalStr,     &quot;mosaic&quot;:   mosaic,     &quot;duration&quot;: fmt.Sprintf(&quot;%v &quot;, t1.Sub(t0)), } t, _ := template.ParseFiles(&quot;results.html&quot;) t.Execute(w, images) <\/code><\/pre>\n<p>  \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d <b>results.html<\/b> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 data URL \u043a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u044f\u043c\u043e \u0432 \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 base64 \u043a\u043e\u043d\u0442\u0435\u043d\u0442.<\/p>\n<pre><code class=\"html\">&lt;!DOCTYPE html&gt; &lt;html&gt;   &lt;head&gt;     &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html; charset=utf-8&quot;&gt;     &lt;title&gt;Mosaic&lt;\/title&gt;     ...   &lt;\/head&gt;      &lt;body&gt;     &lt;div class='container'&gt;         &lt;div class=&quot;col-md-6&quot;&gt;           &lt;img src=&quot;data:image\/jpg;base64,{{ .original }}&quot; width=&quot;100%&quot;&gt;           &lt;div class=&quot;lead&quot;&gt;Original&lt;\/div&gt;         &lt;\/div&gt;         &lt;div class=&quot;col-md-6&quot;&gt;           &lt;img src=&quot;data:image\/jpg;base64,{{ .mosaic }}&quot; width=&quot;100%&quot;&gt;           &lt;div class=&quot;lead&quot;&gt;Mosaic \u2013 {{ .duration }} &lt;\/div&gt;         &lt;\/div&gt;         &lt;div class=&quot;col-md-12 center&quot;&gt;           &lt;a class=&quot;btn btn-lg btn-info&quot; href=&quot;\/&quot;&gt;Go Back&lt;\/a&gt;         &lt;\/div&gt;     &lt;\/div&gt;        &lt;br&gt;   &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  \u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0437\u0430\u0438\u043a\u0438:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/182\/00c\/889\/18200c889c124d12a7546183b8e9d466.png\"\/><br \/>  <i>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0430<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0435\u0440\u0441\u0438\u044e \u0441 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<h1>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438<\/h1>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u2014 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0443 \u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 151 \u041a\u0411 JPEG \u0437\u0430 2,25 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d.<\/p>\n<ol>\n<li>\u0414\u0435\u043b\u0438\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 4 \u0447\u0430\u0441\u0442\u0438<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/li>\n<li>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0434\u043d\u0443 \u043c\u043e\u0437\u0430\u0438\u043a\u0443<\/li>\n<\/ol>\n<p>  \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bf2\/ff9\/4e8\/bf2ff94e871d4bc6aeaf817e4d3882f6.png\"\/><br \/>  <i>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/i><\/p>\n<p>  \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0443\u0442\u044c.<\/p>\n<p>  \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u2014 \u044d\u0442\u043e \u0445\u044d\u043d\u0434\u043b\u0435\u0440 <b>mosaic<\/b>. \u0420\u0430\u043d\u044c\u0448\u0435 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0445\u044d\u043d\u0434\u043b\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438. \u0412 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u0434\u0432\u0435 \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c (<b>cut<\/b>) \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c (<b>combine<\/b>) \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0418 <b>cut<\/b>, \u0438 <b>combine<\/b> \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>mosaic<\/b>.<\/p>\n<pre><code class=\"go\">func mosaic(w http.ResponseWriter, r *http.Request) {     t0 := time.Now()     r.ParseMultipartForm(10485760) \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 10 \u041c\u0411     file, _, _ := r.FormFile(&quot;image&quot;)     defer file.Close()     tileSize, _ := strconv.Atoi(r.FormValue(&quot;tile_size&quot;))     original, _, _ := image.Decode(file)     bounds := original.Bounds()     db := cloneTilesDB()       \/\/ \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c     c1 := cut(original, &db, tileSize, bounds.Min.X, bounds.Min.Y, bounds.Max.X\/2, bounds.Max.Y\/2)     c2 := cut(original, &db, tileSize, bounds.Max.X\/2, bounds.Min.Y, bounds.Max.X, bounds.Max.Y\/2)     c3 := cut(original, &db, tileSize, bounds.Min.X, bounds.Max.Y\/2, bounds.Max.X\/2, bounds.Max.Y)     c4 := cut(original, &db, tileSize, bounds.Max.X\/2, bounds.Max.Y\/2, bounds.Max.X, bounds.Max.Y)       \/\/ \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c     c := combine(bounds, c1, c2, c3, c4)       buf1 := new(bytes.Buffer)     jpeg.Encode(buf1, original, nil)     originalStr := base64.StdEncoding.EncodeToString(buf1.Bytes())       t1 := time.Now()     images := map[string]string{         &quot;original&quot;: originalStr,         &quot;mosaic&quot;:   &lt;-c,         &quot;duration&quot;: fmt.Sprintf(&quot;%v &quot;, t1.Sub(t0)),     }       t, _ := template.ParseFiles(&quot;results.html&quot;)     t.Execute(w, images) } <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <b>cut<\/b>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3b2\/43a\/38d\/3b243a38d3e5478fb360f715d6a7ebf3.png\"\/><br \/>  <i>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 4 \u0447\u0430\u0441\u0442\u0438<\/i><\/p>\n<p>  \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0436\u0435\u0442\u0441\u044f \u043d\u0430 4 \u043a\u0432\u0430\u0434\u0440\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<pre><code class=\"go\">c1 := cut(original, &db, tileSize, bounds.Min.X, bounds.Min.Y, bounds.Max.X\/2, bounds.Max.Y\/2) c2 := cut(original, &db, tileSize, bounds.Max.X\/2, bounds.Min.Y, bounds.Max.X, bounds.Max.Y\/2) c3 := cut(original, &db, tileSize, bounds.Min.X, bounds.Max.Y\/2, bounds.Max.X\/2, bounds.Max.Y) c4 := cut(original, &db, tileSize, bounds.Max.X\/2, bounds.Max.Y\/2, bounds.Max.X, bounds.Max.Y) <\/code><\/pre>\n<p>  \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0435\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u043a\u0430\u043a \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>cut<\/b> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b.<\/p>\n<pre><code class=\"go\">func cut(original image.Image, db *map[string][3]float64, tileSize, x1, y1, x2, y2 int) &lt;-chan image.Image {     c := make(chan image.Image)     sp := image.Point{0, 0}     go func() {         newimage := image.NewNRGBA(image.Rect(x1, y1, x2, y2))         for y := y1; y &lt; y2; y = y + tileSize {             for x := x1; x &lt; x2; x = x + tileSize {                 r, g, b, _ := original.At(x, y).RGBA()                 color := [3]float64{float64(r), float64(g), float64(b)}                 nearest := nearest(color, db)                 file, err := os.Open(nearest)                 if err == nil {                     img, _, err := image.Decode(file)                     if err == nil {                         t := resize(img, tileSize)                         tile := t.SubImage(t.Bounds())                         tileBounds := image.Rect(x, y, x+tileSize, y+tileSize)                         draw.Draw(newimage, tileBounds, tile, sp, draw.Src)                     } else {                         fmt.Println(&quot;error:&quot;, err)                     }                 } else {                     fmt.Println(&quot;error:&quot;, nearest)                 }                 file.Close()             }         }         c &lt;- newimage.SubImage(newimage.Rect)     }()     return c } <\/code><\/pre>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0430 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u042f \u0441\u043e\u0437\u0434\u0430\u044e \u043a\u0430\u043d\u0430\u043b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>cut<\/b> \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b. \u0417\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043d\u0430\u043b \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 <b>mosaic<\/b>, \u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d.<\/p>\n<p>  \u042f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 4 \u0447\u0430\u0441\u0442\u0438 \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0445 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0443. \u041d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443.<\/p>\n<pre><code class=\"go\">func combine(r image.Rectangle, c1, c2, c3, c4 &lt;-chan image.Image) &lt;-chan string {     c := make(chan string)     \/\/ \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443     go func() {         var wg sync.WaitGroup         img := image.NewNRGBA(r)         copy := func(dst draw.Image, r image.Rectangle, src image.Image, sp image.Point) {             draw.Draw(dst, r, src, sp, draw.Src)             wg.Done()         }         wg.Add(4)         var s1, s2, s3, s4 image.Image         var ok1, ok2, ok3, ok4 bool         for  {             select {             case s1, ok1 = &lt;-c1:                 go copy(img, s1.Bounds(), s1, image.Point{r.Min.X, r.Min.Y})             case s2, ok2 = &lt;-c2:                 go copy(img, s2.Bounds(), s2, image.Point{r.Max.X \/ 2, r.Min.Y})             case s3, ok3 = &lt;-c3:                 go copy(img, s3.Bounds(), s3, image.Point{r.Min.X, r.Max.Y\/2})             case s4, ok4 = &lt;-c4:                 go copy(img, s4.Bounds(), s4, image.Point{r.Max.X \/ 2, r.Max.Y \/ 2})             }             if (ok1 && ok2 && ok3 && ok4) {                 break             }         }         \/\/ \u0436\u0434\u0451\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0443         wg.Wait()         buf2 := new(bytes.Buffer)         jpeg.Encode(buf2, newimage, nil)         c &lt;- base64.StdEncoding.EncodeToString(buf2.Bytes())     }()     return c } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u0441ut \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435, \u0430 \u043a\u0430\u043d\u0430\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0412 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <b>copy<\/b>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0437\u0430\u0438\u043a\u0443. \u041f\u043e\u0437\u0436\u0435 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/golang.org\/pkg\/sync\/#WaitGroup\">WaitGroup<\/a>. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <b>wg<\/b> \u0442\u0438\u043f\u0430 WaitGroup, \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <b>Add<\/b> \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043d\u0430 4. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>copy<\/b> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <b>Done<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043d\u0430 1. \u041c\u0435\u0442\u043e\u0434 <b>Wait<\/b> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<\/p>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>combine<\/b> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 4 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438\u0437 <b>cut<\/b> \u0444\u0443\u043d\u043a\u0438\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0442\u043e\u043c\u0430\u0437\u0430\u0438\u043a\u0438. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u044f\u0441\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u043d\u0430\u043b\u0430\u0445. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u041d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u0440\u0430\u0437\u0443 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 select.<\/p>\n<pre><code class=\"go\">var s1, s2, s3, s4 image.Image var ok1, ok2, ok3, ok4 bool for  { select {     case s1, ok1 = &lt;-c1:         go copy(img, s1.Bounds(), s1, image.Point{r.Min.X, r.Min.Y})     case s2, ok2 = &lt;-c2:         go copy(img, s2.Bounds(), s2, image.Point{r.Max.X \/ 2, r.Min.Y})     case s3, ok3 = &lt;-c3:         go copy(img, s3.Bounds(), s3, image.Point{r.Min.X, r.Max.Y \/ 2})     case s4, ok4 = &lt;-c4:         go copy(img, s4.Bounds(), s4, image.Point{r.Max.X \/ 2, r.Max.Y \/ 2})     }     if (ok1 && ok2 && ok3 && ok4) {         break     } } <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c case \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u0430\u043d\u0430\u043b\u0430\u043c, \u0442\u043e \u0413\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d case \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0435\u0433\u043e). \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 image.Image \u0434\u043b\u044f \u043a\u0430\u043d\u0430\u043b\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u0438 <b>copy<\/b>. \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043a\u0430\u043d\u0430\u043b\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (ok1, ok2, ok3 or ok4) \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u043e \u0444\u0430\u043a\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430. \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0445 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0442\u0438\u043f WaitGroup, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <b>combine<\/b> \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434 Wait \u0442\u0438\u043f\u0430 WaitGroup \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0432\u043e\u0435\u0434\u0438\u043d\u043e.<\/p>\n<p>  \u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0437\u0430\u0438\u043a\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/515\/2e6\/98d\/5152e698d7f64d5eb77cb617f8fb4501.png\"\/><br \/>  <i>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438<\/i><\/p>\n<p>  \u0412\u0430\u0448 \u0437\u043e\u0440\u043a\u0438\u0439 \u0433\u043b\u0430\u0437 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0430\u043c\u0438. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0437\u0430\u0438\u043a\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u0430 \u0438\u0437 4 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0441\u043c\u044f\u0433\u0447\u0430\u0435\u0442 \u0433\u0440\u0443\u0431\u044b\u0435 \u043a\u0440\u0430\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u2014 \u0431\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043c\u043e\u0437\u0430\u0438\u043a\u0443 \u0437\u0430 2,25 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0437\u0430 646 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>  \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0430 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u0430\u043a \u043f\u0438\u0448\u0435\u0442 \u0420\u043e\u0431 \u041f\u0430\u0439\u043a \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 &quot;<a href=\"http:\/\/blog.golang.org\/concurrency-is-not-parallelism\">\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/a>&quot;, \u2014 \u044d\u0442\u043e \u0442\u043e \u043a\u0430\u043a \u044f \u0432\u0437\u044f\u043b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430! \u041d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u043d\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e (\u0432\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c 1 CPU), \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u043b\u043e \u0431\u044b \u0436\u0435\u0441\u0442\u043e\u043a\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044f\u0434\u0440\u0430\u0445 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <b>GOMAXPROCS<\/b> \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0440\u0430\u0432\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u044f\u0434\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <b>main.go<\/b>. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <a href=\"http:\/\/golang.org\/pkg\/runtime\/\">runtime<\/a> \u043f\u0435\u0440\u0435\u0434 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<br \/>  <i>(\u041f\u0440\u0438\u043c. \u043f\u0435\u0440. \u2014 \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 \u0413\u043e 1,5. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043e 1,5 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c GOMAXPROCS \u0431\u044b\u043b\u043e 1, \u043a\u0430\u043a \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0430\u0432\u0442\u043e\u0440. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 1,5 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 GOMAXPROCS \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u0447\u0438\u0441\u043b\u0443 \u0432\u0430\u0448\u0438\u0445 \u044f\u0434\u0435\u0440)<\/i><\/p>\n<pre><code class=\"go\">func main() {     \/\/ \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044f\u0434\u0435\u0440 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b     fmt.Println(&quot;Number of CPUs:&quot;, runtime.NumCPU())     runtime.GOMAXPROCS(runtime.NumCPU())     fmt.Println(&quot;Starting mosaic server ...&quot;)     mux := http.NewServeMux()     files := http.FileServer(http.Dir(&quot;public&quot;))     mux.Handle(&quot;\/static\/&quot;, http.StripPrefix(&quot;\/static\/&quot;, files))     mux.HandleFunc(&quot;\/&quot;, upload)     mux.HandleFunc(&quot;\/mosaic&quot;, mosaic)     server := &http.Server{         Addr:    &quot;127.0.0.1:8080&quot;,         Handler: mux,     }     TILESDB = tilesDB()     fmt.Println(&quot;Mosaic server started.&quot;)     server.ListenAndServe() } <\/code><\/pre>\n<p>  \u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043a\u043e\u0442\u0438\u043a\u043e\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ffc\/b59\/134\/ffcb59134cd04228a30c4b42d6b18fb6.png\"\/><br \/>  <i>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0435, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 8 CPU<\/i><\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0435\u0449\u0451 \u0432\u044b\u0440\u043e\u0441\u043b\u0430 \u0432 3 \u0440\u0430\u0437\u0430: \u0441 646 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e 216 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434! \u0410 \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441 \u043d\u0430\u0448\u0438\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043c\u043e\u0437\u0430\u0438\u043a\u0443 \u0437\u0430 2,25 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0432 10 \u0440\u0430\u0437! \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435. \u041c\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 \u043d\u0430\u0448\u0435 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 8 \u044f\u0434\u0440\u0430\u0445, \u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u0442\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0431\u044b \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>  \u0415\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438. \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u043c\u044b \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b mosaic.go. The only difference is concurrency, and that is a testament to how powerful it is.   \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/263019\/\"> http:\/\/habrahabr.ru\/post\/263019\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <i>\u042d\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0431\u043b\u043e\u0433\u043f\u043e\u0441\u0442\u0430 \u0421\u0430\u0443 \u0428\u043e\u043d \u0427\u0430\u043d\u0433\u0430. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438 \u043d\u0430 \u0413\u043e, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430 \u0441\u0447\u0451\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 (\u043a\u0430\u043d\u0430\u043b\u044b, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b).<br \/>  \u041f\u043e \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044f\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043b\u0438\u0447\u043a\u0443.<\/i><\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u043e\u0439 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0434\u0440\u0443\u0433 <a href=\"https:\/\/twitter.com\/indianguru\">\u0421\u0430\u0442\u0438\u0448 \u0422\u0430\u043b\u0438\u043c<\/a> \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0438\u0434\u0435\u044e \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0413\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u0443\u043c\u0435\u043d\u0438\u044f \u0413\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446 (\u0438\u043b\u0438 \u043e\u043a\u043e\u043b\u043e \u0442\u043e\u0433\u043e) \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u0440\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0413\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043f\u0440\u0438\u0437\u044b, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043c\u043e\u0447\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0438 \u0441\u0435\u0431\u0435 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u0421\u0430\u0442\u0438\u0448 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0438 \u044f \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0434\u043b\u044f <a href=\"http:\/\/golang-challenge.com\/go-challenge3\/\">\u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f<\/a> (challenge #3).<\/p>\n<p>  \u0411\u0443\u0434\u0443\u0447\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0435\u0439 \u043a\u0430\u0440\u044c\u0435\u0440\u044b, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043c\u044b\u0441\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043d\u0430 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0435, <a href=\"https:\/\/developer.yahoo.com\/blogs\/ydn\/creating-photo-mosaics-yahoo-boss-image-search-7453.html\">\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0420\u0443\u0431\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0437\u0430\u0438\u043a\u0438<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0438\u0434\u0435\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0442\u043e\u043c\u043e\u0437\u0430\u0438\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bc3\/3df\/49c\/bc33df49c36546acac8155694b2ef4f5.png\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-261926","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=261926"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/261926\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=261926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=261926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=261926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}