{"id":404785,"date":"2024-06-29T17:55:35","date_gmt":"2024-06-29T17:55:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=404785"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T17:55:35","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=404785","title":{"rendered":"<span>Hazelcast + Kibana: \u043b\u0443\u0447\u0448\u0438\u0435 \u0434\u0440\u0443\u0437\u044c\u044f \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9b4\/024\/05a\/9b402405a487eb44003acbfe377aff3f.jpg\" width=\"1280\" height=\"570\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b4\/024\/05a\/9b402405a487eb44003acbfe377aff3f.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u0441\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0430\u0443\u043a\u0438 \u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u044e\u0434\u044c\u043c\u0438.\u00a0Python, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u044b\u043c\u0438 \u043c\u043e\u0449\u043d\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043d\u043e \u043d\u0435 \u0442\u0435\u0440\u044f\u0439\u0442\u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Java (\u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c).\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043d\u0438 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u043b\u0438\u0448\u044c \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/h2>\n<p>\u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u00a0<a href=\"https:\/\/wikipedia.org\/\" rel=\"noopener noreferrer nofollow\"><strong>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0435\u0439<\/strong><\/a>.\u00a0\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f &#8212; \u044d\u0442\u043e \u043e\u043d\u043b\u0430\u0439\u043d \u044d\u043d\u0446\u0438\u043a\u043b\u043e\u043f\u0435\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e.\u00a0\u041f\u043e \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c:<\/p>\n<blockquote>\n<p><em>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f &#8212; \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u0447\u043d\u0430\u044f \u043e\u043d\u043b\u0430\u0439\u043d \u044d\u043d\u0446\u0438\u043a\u043b\u043e\u043f\u0435\u0434\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u0446\u0435\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0438\u043a\u0438.<\/em><\/p>\n<\/blockquote>\n<p>\u0412\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Wikipedia\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u0442\u0430\u0442\u044c\u0438<\/strong><\/a>\u00a0\u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.\u00a0\u041e\u0447\u0435\u043d\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u043d\u043e.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0440\u0435\u0448\u0430\u0442\u044c, \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u0439 &#8212; \u0438\u043b\u0438 \u043d\u0435\u0442.\u00a0\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0430\u043a \u0432\u0441\u0435\u043c\u0438\u0440\u043d\u044b\u0439 Git \u043e\u0431\u0437\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0414\u0430\u0436\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u043f\u043e\u0441\u044b\u043b\u0430\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u0447\u043b\u0435\u043d\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0432 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u0430, \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0439 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448 IP-\u0430\u0434\u0440\u0435\u0441. IP \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043c\u0435\u043d\u0438 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443.\u00a0\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u0440\u043e\u0447\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u0447\u0435\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c, \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u044b\u0432\u043e\u0434 \u043e \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0435\u0440\u0443 \u044f\u0437\u044b\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0436\u0443 \u0438\u0445 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043c\u0438\u0440\u0430.\u00a0\u0417\u0430\u0442\u0435\u043c \u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044f\u0437\u044b\u043a \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443.<\/p>\n<p>\u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0447\u044c \u044d\u0442\u043e, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443.<\/p>\n<h2>\u041d\u0430\u043d\u0435\u0441\u0435\u043c \u0432\u0438\u0437\u0438\u0442 \u0432 \u043c\u0438\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 &#8212; \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435,\u00a0\u00a0<em>\u0442\u043e \u0435\u0441\u0442\u044c<\/em>\u00a0\u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0432 \u043d\u0430\u0448\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0<\/p>\n<p>\u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c\u0430 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Special:RecentChanges\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/strong><\/a>.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0436\u043c\u0435\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0438\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043d\u0435\u043c\u0443).\u00a0\u0412\u043e\u0442 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/538\/dce\/ab5\/538dceab55d17fcd24c11a47e37e5056.png\" width=\"2416\" height=\"424\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/538\/dce\/ab5\/538dceab55d17fcd24c11a47e37e5056.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Hazelcast.\u00a0\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c,\u00a0<a href=\"https:\/\/github.com\/hazelcast-demos\/wikipedia-changes\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub<\/strong><\/a>.<\/p>\n<p>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c\u00a0<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Server-sent_events\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/strong><\/a>.\u00a0\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<abbr title=\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f\">SSE<\/abbr>\u00a0(Server-Sent Events) \u0432\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.\u00a0\u041d\u0430\u00a0<abbr title=\"\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 Java\">JVM<\/abbr>\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e SSE-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Spring WebClient.\u00a0\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/launchdarkly\/okhttp-eventsource\" rel=\"noopener noreferrer nofollow\"><strong>OkHttp EventSource,<\/strong><\/a>\u00a0\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043b\u0435\u0433\u043a\u0438\u0439 &#8212; \u043e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 OkHttp \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 POM:<\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>com.hazelcast&lt;\/groupId>     &lt;artifactId>hazelcast&lt;\/artifactId>     &lt;version>${hazelcast.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>com.launchdarkly&lt;\/groupId>     &lt;artifactId>okhttp-eventsource&lt;\/artifactId>     &lt;version>2.3.2&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <\/h2>\n<p>\u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Hazelcast \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.\u00a0\u0421 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 HTTP \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0441 SSE \u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 SSE \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439\u00a0<code>Source <\/code>\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043e\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0443.<\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c07\/c98\/2b2\/c07c982b2ee4acb79fa49825627825e0.svg\" width=\"922\" height=\"480\"\/><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p><code>Context <\/code>\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439.\u00a0\u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>WikipediaChangeEventHandler <\/code>\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 SSE.<\/p>\n<\/li>\n<li>\n<p><code>WikipediaChangeEventHandler<\/code> &#8212; \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438.\u00a0\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u0441\u0432\u043e\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0432\u0438\u0436\u043e\u043a Hazelcast \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<code>Call <\/code>\u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>WikipediaChangeEventHandler<\/code>, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 <code>JSONObject <\/code>\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/06c\/dc2\/564\/06cdc2564bd3fcd4121f3e87ee8413c8.svg\" width=\"1385\" height=\"1343\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"json\">{\"server_script_path\":\"\/w\",\"server_name\":\"en.wikipedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":false,\"wiki\":\"enwiki\",\"type\":\"categorize\",\"title\":\"Category:Biography articles without listas parameter\",\"meta\":{\"dt\":\"2021-07-28T04:07:40Z\",\"partition\":0,\"offset\":363427323,\"stream\":\"mediawiki.recentchange\",\"domain\":\"en.wikipedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"01592c7a-03f1-46cd-9472-3bbe63aff0ec\",\"uri\":\"https:\/\/en.wikipedia.org\/wiki\/Category:Biography_articles_without_listas_parameter\",\"request_id\":\"b49c3b98-2064-44da-aab4-ab7b3bf65bdd\"},\"namespace\":14,\"comment\":\"[[:Talk:Jeff S. Klotz]] removed from category\",\"id\":1406951122,\"server_url\":\"https:\/\/en.wikipedia.org\",\"user\":\"Lepricavark\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/Talk:Jeff_S._Klotz\\\" title=\\\"Talk:Jeff S. Klotz\\\">Talk:Jeff S. Klotz&lt;\\\/a> removed from category\",\"timestamp\":1627445260} {\"server_script_path\":\"\/w\",\"server_name\":\"commons.wikimedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":true,\"wiki\":\"commonswiki\",\"type\":\"categorize\",\"title\":\"Category:Flickr images reviewed by FlickreviewR 2\",\"meta\":{\"dt\":\"2021-07-28T04:07:42Z\",\"partition\":0,\"offset\":363427324,\"stream\":\"mediawiki.recentchange\",\"domain\":\"commons.wikimedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"68f3a372-112d-4dae-af8f-25d88984f1d8\",\"uri\":\"https:\/\/commons.wikimedia.org\/wiki\/Category:Flickr_images_reviewed_by_FlickreviewR_2\",\"request_id\":\"1a132610-85e0-4954-9329-9e44691970aa\"},\"namespace\":14,\"comment\":\"[[:File:Red squirrel (51205279267).jpg]] added to category\",\"id\":1729953358,\"server_url\":\"https:\/\/commons.wikimedia.org\",\"user\":\"FlickreviewR 2\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/File:Red_squirrel_(51205279267).jpg\\\" title=\\\"File:Red squirrel (51205279267).jpg\\\">File:Red squirrel (51205279267).jpg&lt;\\\/a> added to category\",\"timestamp\":1627445262} {\"server_script_path\":\"\/w\",\"server_name\":\"commons.wikimedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":true,\"wiki\":\"commonswiki\",\"type\":\"categorize\",\"title\":\"Category:Flickr review needed\",\"meta\":{\"dt\":\"2021-07-28T04:07:42Z\",\"partition\":0,\"offset\":363427325,\"stream\":\"mediawiki.recentchange\",\"domain\":\"commons.wikimedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"b4563ed9-a6f2-40de-9e71-c053f5352846\",\"uri\":\"https:\/\/commons.wikimedia.org\/wiki\/Category:Flickr_review_needed\",\"request_id\":\"1a132610-85e0-4954-9329-9e44691970aa\"},\"namespace\":14,\"comment\":\"[[:File:Red squirrel (51205279267).jpg]] removed from category\",\"id\":1729953359,\"server_url\":\"https:\/\/commons.wikimedia.org\",\"user\":\"FlickreviewR 2\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/File:Red_squirrel_(51205279267).jpg\\\" title=\\\"File:Red squirrel (51205279267).jpg\\\">File:Red squirrel (51205279267).jpg&lt;\\\/a> removed from category\",\"timestamp\":1627445262} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":true,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":31968,\"old\":31909},\"type\":\"edit\",\"title\":\"Q40652\",\"revision\":{\"new\":1468164253,\"old\":1446892882},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427326,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"70784dde-0360-4292-9f62-81323ced9aa7\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q40652\",\"request_id\":\"f9686303-ffed-4c62-8532-bf870288ff55\"},\"namespace\":0,\"comment\":\"\/* wbsetaliases-add:1|zh *\/ \u8482\u6258, [[User:Cewbot#Import labels\/aliases|import label\/alias]] from [[zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a]], [[zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14]], [[zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae]], [[zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510]], [[zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229]], [[zh:2019\u5e74\u5357\u7f8e\u8d85\u7ea7\u5fb7\u6bd4\u676f]], [[zh:2019\u5e74\u7f8e\u6d32\u676f\u51b3\u8d5b]], [[zh:2019\u5e74\u7f8e\u6d32\u676f\u53c2\u8d5b\u540d\u5355]], [[zh:2021\u5e74\u7f8e\u6d32\u676fB\u7ec4]], [[zh:2021\u5e74\u7f8e\u6d32\u570b\u5bb6\u76c3\u6c7a\u8cfd]]\",\"id\":1514670479,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"Cewbot\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Added Chinese alias: &lt;\\\/span>&lt;\\\/span> \u8482\u6258, &lt;a href=\\\"\/wiki\/User:Cewbot#Import_labels\/aliases\\\" title=\\\"User:Cewbot\\\">import label\/alias&lt;\\\/a> from &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%B7%B4%E8%A5%BF%E5%9C%8B%E5%AE%B6%E8%B6%B3%E7%90%83%E9%9A%8A\\\" class=\\\"extiw\\\" title=\\\"zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a\\\">zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E4%BD%95%E5%A1%9E%C2%B7%E4%BF%9D%E7%BD%97%C2%B7%E8%B4%9D%E5%A1%9E%E6%8B%89%C2%B7%E9%A9%AC%E5%B8%8C%E5%B0%94%C2%B7%E5%84%92%E5%B0%BC%E5%A5%A5%E5%B0%94\\\" class=\\\"extiw\\\" title=\\\"zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14\\\">zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2018%E5%B9%B4%E5%9C%8B%E9%9A%9B%E8%B6%B3%E5%8D%94%E4%B8%96%E7%95%8C%E7%9B%83%E5%8F%83%E8%B3%BD%E7%90%83%E5%93%A1%E5%90%8D%E5%96%AE\\\" class=\\\"extiw\\\" title=\\\"zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae\\\">zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%9F%83%E5%BE%B7%E7%88%BE%C2%B7%E7%B1%B3%E5%88%A9%E5%94%90\\\" class=\\\"extiw\\\" title=\\\"zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510\\\">zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%E7%88%BE%C2%B7%E9%A6%AC%E4%B8%81%E5%85%A7%E5%88%A9\\\" class=\\\"extiw\\\" title=\\\"zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229\\\">zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2019%E5%B9%B4%E5%8D%97%E7%BE%8E%E8%B6%85%E7%BA%A7%E5%BE%B7%E6%AF%94%E6%9D%AF\\\" class=\\\"extiw\\\" title=\\\"zh:2019\u5e74\u5357\u7f8e\u8d85\u7ea7\u5fb7\u6bd4\u676f\\\">zh:2019\u5e74\u5357\u7f8e\u8d85\u7ea7\u5fb7\u6bd4\u676f&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2019%E5%B9%B4%E7%BE%8E%E6%B4%B2%E6%9D%AF%E5%86%B3%E8%B5%9B\\\" class=\\\"extiw\\\" title=\\\"zh:2019\u5e74\u7f8e\u6d32\u676f\u51b3\u8d5b\\\">zh:2019\u5e74\u7f8e\u6d32\u676f\u51b3\u8d5b&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2019%E5%B9%B4%E7%BE%8E%E6%B4%B2%E6%9D%AF%E5%8F%82%E8%B5%9B%E5%90%8D%E5%8D%95\\\" class=\\\"extiw\\\" title=\\\"zh:2019\u5e74\u7f8e\u6d32\u676f\u53c2\u8d5b\u540d\u5355\\\">zh:2019\u5e74\u7f8e\u6d32\u676f\u53c2\u8d5b\u540d\u5355&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2021%E5%B9%B4%E7%BE%8E%E6%B4%B2%E6%9D%AFB%E7%BB%84\\\" class=\\\"extiw\\\" title=\\\"zh:2021\u5e74\u7f8e\u6d32\u676fB\u7ec4\\\">zh:2021\u5e74\u7f8e\u6d32\u676fB\u7ec4&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2021%E5%B9%B4%E7%BE%8E%E6%B4%B2%E5%9C%8B%E5%AE%B6%E7%9B%83%E6%B1%BA%E8%B3%BD\\\" class=\\\"extiw\\\" title=\\\"zh:2021\u5e74\u7f8e\u6d32\u570b\u5bb6\u76c3\u6c7a\u8cfd\\\">zh:2021\u5e74\u7f8e\u6d32\u570b\u5bb6\u76c3\u6c7a\u8cfd&lt;\\\/a>\",\"timestamp\":1627445263} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":true,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":239,\"old\":161},\"type\":\"edit\",\"title\":\"Q107674623\",\"revision\":{\"new\":1468164250,\"old\":1468164243},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427327,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"40260137-ee52-4a67-b024-22d3cf86907a\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q107674623\",\"request_id\":\"db6e073a-19f6-4658-9425-7992b34b4208\"},\"namespace\":0,\"comment\":\"\/* wbsetlabel-add:1|de *\/ Favolaschia filopes\",\"id\":1514670480,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"SuccuBot\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Bezeichnung f\u00fcr [de] hinzugef\u00fcgt: &lt;\\\/span>&lt;\\\/span> Favolaschia filopes\",\"timestamp\":1627445263} {\"server_script_path\":\"\/w\",\"server_name\":\"ko.wikipedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":true,\"bot\":true,\"wiki\":\"kowiki\",\"length\":{\"new\":1158,\"old\":1161},\"type\":\"edit\",\"title\":\"\uc774\uc2dc\ub2e4\ud14c \uc57c\uc2a4\ud0a4\",\"revision\":{\"new\":29895993,\"old\":26098259},\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427328,\"stream\":\"mediawiki.recentchange\",\"domain\":\"ko.wikipedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"c23bdb77-e88c-48d3-9d24-3c4dd8ef1dbf\",\"uri\":\"https:\/\/ko.wikipedia.org\/wiki\/%EC%9D%B4%EC%8B%9C%EB%8B%A4%ED%85%8C_%EC%95%BC%EC%8A%A4%ED%82%A4\",\"request_id\":\"0010e77b-fbcd-4de8-a5ad-4616adbbd6d4\"},\"namespace\":0,\"comment\":\"\ubd07: \ubd84\ub958 \uc774\ub984 \ubcc0\uacbd (\ubd84\ub958:1984\ub144 \ud0dc\uc5b4\ub0a8 \u2192 [[\ubd84\ub958:1984\ub144 \ucd9c\uc0dd]])\",\"id\":56333828,\"server_url\":\"https:\/\/ko.wikipedia.org\",\"user\":\"TedBot\",\"parsedcomment\":\"\ubd07: \ubd84\ub958 \uc774\ub984 \ubcc0\uacbd (\ubd84\ub958:1984\ub144 \ud0dc\uc5b4\ub0a8 \u2192 &lt;a href=\\\"\/wiki\/%EB%B6%84%EB%A5%98:1984%EB%85%84_%EC%B6%9C%EC%83%9D\\\" title=\\\"\ubd84\ub958:1984\ub144 \ucd9c\uc0dd\\\">\ubd84\ub958:1984\ub144 \ucd9c\uc0dd&lt;\\\/a>)\",\"timestamp\":1627445263} {\"server_script_path\":\"\/w\",\"server_name\":\"commons.wikimedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":true,\"wiki\":\"commonswiki\",\"length\":{\"new\":3864,\"old\":527},\"type\":\"edit\",\"title\":\"File:Albizia kalkora 06.jpg\",\"revision\":{\"new\":577195372,\"old\":577193453},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:44Z\",\"partition\":0,\"offset\":363427329,\"stream\":\"mediawiki.recentchange\",\"domain\":\"commons.wikimedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"1a7fcb55-dec7-4303-b757-19f6a6a4dcdd\",\"uri\":\"https:\/\/commons.wikimedia.org\/wiki\/File:Albizia_kalkora_06.jpg\",\"request_id\":\"7f841b4a-ac70-4c2b-a148-bc07696ccf7a\"},\"namespace\":6,\"comment\":\"\/* wbeditentity-update:0| *\/ Adding structured data: date, camera, author, copyright &amp; source\",\"id\":1729953360,\"server_url\":\"https:\/\/commons.wikimedia.org\",\"user\":\"BotMultichillT\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Changed an entity: &lt;\\\/span>&lt;\\\/span> Adding structured data: date, camera, author, copyright &amp; source\",\"timestamp\":1627445264} {\"server_script_path\":\"\/w\",\"server_name\":\"id.wikipedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":true,\"bot\":true,\"wiki\":\"idwiki\",\"length\":{\"new\":977,\"old\":962},\"type\":\"edit\",\"title\":\"Euporus linearis\",\"revision\":{\"new\":18801346,\"old\":16068468},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427330,\"stream\":\"mediawiki.recentchange\",\"domain\":\"id.wikipedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"6c3882f9-9fd0-4f43-ab69-e538762c7981\",\"uri\":\"https:\/\/id.wikipedia.org\/wiki\/Euporus_linearis\",\"request_id\":\"dea59b42-7c97-4cbc-9384-5d8836a981ec\"},\"namespace\":0,\"comment\":\"[[Wikipedia:Bot|Bot]]: fixed \u2192 [[Kategori:Taxonbar tanpa parameter from|taxonbar tanpa parameter from]]\",\"id\":42309169,\"server_url\":\"https:\/\/id.wikipedia.org\",\"user\":\"HsfBot\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/Wikipedia:Bot\\\" title=\\\"Wikipedia:Bot\\\">Bot&lt;\\\/a>: fixed \u2192 &lt;a href=\\\"\/wiki\/Kategori:Taxonbar_tanpa_parameter_from\\\" title=\\\"Kategori:Taxonbar tanpa parameter from\\\">taxonbar tanpa parameter from&lt;\\\/a>\",\"timestamp\":1627445263} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":false,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":25025,\"old\":24908},\"type\":\"edit\",\"title\":\"Q80075231\",\"revision\":{\"new\":1468164255,\"old\":1467697536},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:44Z\",\"partition\":0,\"offset\":363427331,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"720f6507-1ea1-4665-b1b9-1665c97450a9\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q80075231\",\"request_id\":\"43b7d511-007f-4005-a562-5002c7e0aff4\"},\"namespace\":0,\"comment\":\"\/* wbsetdescription-add:1|dv *\/ \u0787\u07a6\u0786\u07aa\u0787\u07a8\u078d\u07a7 \u0782\u07a6\u0786\u07a6\u078c\u07aa\u078e\u07a6\u0787\u07a8\u0788\u07a7 \u078c\u07a6\u0783\u07a8\u0787\u07ac\u0787\u07b0, [[:toollabs:quickstatements\/#\/batch\/60416|batch #60416]]\",\"id\":1514670481,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"EN-Jungwon\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Added [dv] description: &lt;\\\/span>&lt;\\\/span> \u0787\u07a6\u0786\u07aa\u0787\u07a8\u078d\u07a7 \u0782\u07a6\u0786\u07a6\u078c\u07aa\u078e\u07a6\u0787\u07a8\u0788\u07a7 \u078c\u07a6\u0783\u07a8\u0787\u07ac\u0787\u07b0, &lt;a href=\\\"https:\/\/iw.toolforge.org\/quickstatements\/#.2Fbatch.2F60416\\\" class=\\\"extiw\\\" title=\\\"toollabs:quickstatements\/\\\">batch #60416&lt;\\\/a>\",\"timestamp\":1627445264} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":false,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":5312,\"old\":4884},\"type\":\"edit\",\"title\":\"Q85766437\",\"revision\":{\"new\":1468164246,\"old\":1342535335},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:42Z\",\"partition\":0,\"offset\":363427332,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"ad173600-09b7-4ccd-9490-4a60f6a432ea\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q85766437\",\"request_id\":\"1228a17e-2baa-46cc-a3bc-2049a62982c9\"},\"namespace\":0,\"comment\":\"\/* wbcreateclaim-create:1| *\/ [[Property:P7937]]: [[Q7366]], [[:toollabs:quickstatements\/#\/batch\/60404|batch #60404]]\",\"id\":1514670483,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"Moebeus\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Created claim: &lt;\\\/span>&lt;\\\/span> &lt;a href=\\\"\/wiki\/Property:P7937\\\" title=\\\"Property:P7937\\\">Property:P7937&lt;\\\/a>: &lt;a href=\\\"\/wiki\/Q7366\\\" title=\\\"Q7366\\\">Q7366&lt;\\\/a>, &lt;a href=\\\"https:\/\/iw.toolforge.org\/quickstatements\/#.2Fbatch.2F60404\\\" class=\\\"extiw\\\" title=\\\"toollabs:quickstatements\/\\\">batch #60404&lt;\\\/a>\",\"timestamp\":1627445262} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":false,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":5134,\"old\":5126},\"type\":\"edit\",\"title\":\"Q12444793\",\"revision\":{\"new\":1468164254,\"old\":1413396080},\"patrolled\":false,\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427333,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"c01d52c5-c476-4554-814d-513342e04686\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q12444793\",\"request_id\":\"6d0a32b9-1234-4c8e-a02a-d92608f06d33\"},\"namespace\":0,\"comment\":\"\/* wbsetdescription-set:1|hi *\/ \u092d\u093e\u0930\u0924 \u0915\u0947 \u0909\u0924\u094d\u0924\u0930\u093e\u0916\u0923\u094d\u0921 \u0930\u093e\u091c\u094d\u092f \u0915\u093e \u090f\u0915 \u0917\u093e\u0901\u0935 bikash\",\"id\":1514670482,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"2409:4061:219C:613E:DFD9:6BD4:F234:E7E0\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">\u092c\u0926\u0932\u093e [hi] \u0935\u093f\u0935\u0930\u0923: &lt;\\\/span>&lt;\\\/span> \u092d\u093e\u0930\u0924 \u0915\u0947 \u0909\u0924\u094d\u0924\u0930\u093e\u0916\u0923\u094d\u0921 \u0930\u093e\u091c\u094d\u092f \u0915\u093e \u090f\u0915 \u0917\u093e\u0901\u0935 bikash\",\"timestamp\":1627445263} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":false,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":22936,\"old\":22819},\"type\":\"edit\",\"title\":\"Q80075234\",\"revision\":{\"new\":1468164258,\"old\":1467697544},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:44Z\",\"partition\":0,\"offset\":363427334,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"7016afae-6691-4dca-bfaf-a5a3363edf31\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q80075234\",\"request_id\":\"aa4f6828-149d-4feb-a3cf-cd39902773fe\"},\"namespace\":0,\"comment\":\"\/* wbsetdescription-add:1|dv *\/ \u0787\u07a6\u0786\u07aa\u0787\u07a8\u078d\u07a7 \u0782\u07a6\u0786\u07a6\u078c\u07aa\u078e\u07a6\u0787\u07a8\u0788\u07a7 \u078c\u07a6\u0783\u07a8\u0787\u07ac\u0787\u07b0, [[:toollabs:quickstatements\/#\/batch\/60416|batch #60416]]\",\"id\":1514670484,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"EN-Jungwon\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Added [dv] description: &lt;\\\/span>&lt;\\\/span> \u0787\u07a6\u0786\u07aa\u0787\u07a8\u078d\u07a7 \u0782\u07a6\u0786\u07a6\u078c\u07aa\u078e\u07a6\u0787\u07a8\u0788\u07a7 \u078c\u07a6\u0783\u07a8\u0787\u07ac\u0787\u07b0, &lt;a href=\\\"https:\/\/iw.toolforge.org\/quickstatements\/#.2Fbatch.2F60416\\\" class=\\\"extiw\\\" title=\\\"toollabs:quickstatements\/\\\">batch #60416&lt;\\\/a>\",\"timestamp\":1627445264} {\"server_script_path\":\"\/w\",\"server_name\":\"de.wikipedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":true,\"wiki\":\"dewiki\",\"length\":{\"new\":17069,\"old\":17075},\"type\":\"edit\",\"title\":\"Liste der Biografien\/Caro\",\"revision\":{\"new\":214271460,\"old\":213857611},\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427335,\"stream\":\"mediawiki.recentchange\",\"domain\":\"de.wikipedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"6618b0ab-eadf-405a-a474-ec2ad9fef8bb\",\"uri\":\"https:\/\/de.wikipedia.org\/wiki\/Liste_der_Biografien\/Caro\",\"request_id\":\"23181b86-03de-4153-ad99-e7e20e611ed6\"},\"namespace\":0,\"comment\":\"Bot: Automatische Aktualisierung, siehe [[Benutzer:APPERbot\/LdB]]\",\"id\":309672385,\"server_url\":\"https:\/\/de.wikipedia.org\",\"user\":\"APPERbot\",\"parsedcomment\":\"Bot: Automatische Aktualisierung, siehe &lt;a href=\\\"\/wiki\/Benutzer:APPERbot\/LdB\\\" title=\\\"Benutzer:APPERbot\/LdB\\\">Benutzer:APPERbot\/LdB&lt;\\\/a>\",\"timestamp\":1627445263}<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u043f\u0438\u0441\u044c, \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"json\">{   \"$schema\": \"\/mediawiki\/recentchange\/1.0.0\",   \"bot\": true,   \"comment\": \"Bot: Automatische Aktualisierung, siehe [[Benutzer:APPERbot\/LdB]]\",   \"id\": 309672385,   \"length\": {     \"new\": 17069,     \"old\": 17075   },   \"meta\": {     \"domain\": \"de.wikipedia.org\",     \"dt\": \"2021-07-28T04:07:43Z\",     \"id\": \"6618b0ab-eadf-405a-a474-ec2ad9fef8bb\",     \"offset\": 363427335,     \"partition\": 0,     \"request_id\": \"23181b86-03de-4153-ad99-e7e20e611ed6\",     \"stream\": \"mediawiki.recentchange\",     \"topic\": \"codfw.mediawiki.recentchange\",     \"uri\": \"https:\/\/de.wikipedia.org\/wiki\/Liste_der_Biografien\/Caro\"   },   \"minor\": false,   \"namespace\": 0,   \"parsedcomment\": \"Bot: Automatische Aktualisierung, siehe Benutzer:APPERbot\/LdB\",   \"revision\": {     \"new\": 214271460,     \"old\": 213857611   },   \"server_name\": \"de.wikipedia.org\",   \"server_script_path\": \"\/w\",   \"server_url\": \"https:\/\/de.wikipedia.org\",   \"timestamp\": 1627445263,   \"title\": \"Liste der Biografien\/Caro\",   \"type\": \"edit\",   \"user\": \"APPERbot\",   \"wiki\": \"dewiki\" }<\/code><\/pre>\n<h2>Kibana \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0438 \u044d\u0442\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Kibana.\u00a0Kibana \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 ELK:<\/p>\n<ul>\n<li>\n<p>Elasticsearch \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, Kibana \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 Elasticsearch.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a3\/a1d\/b5e\/7a3a1db5eb9b83dc3a2b5194946c1f8a.png\" alt=\"\u0421 \u0441\u0430\u0439\u0442\u0430 https:\/\/www.elastic.co\/kibana\/\" title=\"\u0421 \u0441\u0430\u0439\u0442\u0430 https:\/\/www.elastic.co\/kibana\/\" width=\"800\" height=\"549\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a3\/a1d\/b5e\/7a3a1db5eb9b83dc3a2b5194946c1f8a.png\"\/><figcaption>\u0421 \u0441\u0430\u0439\u0442\u0430 https:\/\/www.elastic.co\/kibana\/<\/figcaption><\/figure>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Elasticsearch.\u00a0\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u00a0<code>Sink<\/code>.\u00a0\u0425\u043e\u0442\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Elasticsearch API \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, Hazelcast \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0449\u0435\u0435 \u0432\u0430\u0448\u0443 \u0440\u0430\u0431\u043e\u0442\u0443.\u00a0\u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435\u00a0JAR\u00a0\u0432\u00a0classpath, \u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <code>com.hazelcast.jet:hazelcast-jet-elasticsearch-7<\/code><\/p>\n<pre><code class=\"kotlin\">private val clientBuilder = {   val env = System.getenv()   val user = env.getOrDefault(\"ELASTICSEARCH_USERNAME\", \"elastic\")      \/\/ 1   val password = env.getOrDefault(\"ELASTICSEARCH_PASSWORD\", \"changeme\") \/\/ 1   val host = env.getOrDefault(\"ELASTICSEARCH_HOST\", \"localhost\")        \/\/ 1   val port = env.getOrDefault(\"ELASTICSEARCH_PORT\", \"9200\").toInt()     \/\/ 1   ElasticClients.client(user, password, host, port)                     \/\/ 2 }  val elasticsearch = ElasticSinks.elastic(clientBuilder) {   IndexRequest(\"wikipedia\").source(it.toString(), XContentType.JSON)    \/\/ 3 }<\/code><\/pre>\n<ol>\n<li>\n<p>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443 Elasticsearch<\/p>\n<\/li>\n<li>\n<p>Hazelcast \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u00a0<abbr title=\"Elasticsearch\">ES<\/abbr>.\u00a0<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c:<\/p>\n<pre><code class=\"kotlin\">val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .writeTo(elasticsearch) } Hazelcast.bootstrappedInstance().jet.newJob(pipeline)<\/code><\/pre>\n<p>\u0412\u0438\u0448\u0435\u043d\u043a\u0430 \u043d\u0430 \u0442\u043e\u0440\u0442\u0435, \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c, Hazelcast API \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u044e\u0434\u044f\u043c, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0435 API.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440, \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 Kibana. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <code>docker-compose.yml<\/code>. \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>docker compose up<\/code>.<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0<a href=\"http:\/\/localhost:5601\/\" rel=\"noopener noreferrer nofollow\"><strong>http:\/\/localhost:5601<\/strong><\/a> \u0432 \u0441\u0432\u043e\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0439\u0442\u0435\u0441\u044c \u0441 \u043b\u043e\u0433\u0438\u043d\u043e\u043c\u00a0<code>elastic<\/code>\u00a0\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c\u00a0<code>changeme<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u201cCreate index pattern\u201d <\/p>\n<\/li>\n<li>\n<p>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 <code>wikipedia<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 <\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u201cNext step\u201d <\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <code>meta.dt<\/code>\u00a0\u0434\u043b\u044f \u043f\u043e\u043b\u044f Time <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u0432\u0432\u043e\u0434, \u043d\u0430\u0436\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0443 \u201cCreate index pattern\u201d <\/p>\n<\/li>\n<li>\n<p>\u0412 \u043c\u0435\u043d\u044e \u0441\u043b\u0435\u0432\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Analytics \u2192 Discover<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/012\/162\/29e\/01216229e2520f3a187451f93d1b25d6.png\" width=\"2534\" height=\"1850\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/012\/162\/29e\/01216229e2520f3a187451f93d1b25d6.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b.\u00a0\u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c (\u0441\u043f\u0440\u0430\u0432\u0430), \u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (\u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u044b\u0448\u0435).<\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u00ab\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445\u00bb \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f Elasticsearch \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.\u00a0\u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u044b Hazelcast, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u0442\u0435\u043a\u0430:<\/p>\n<pre><code>15:02:34.898 [ WARN] [c.h.j.i.e.TaskletExecutionService] [192.168.1.62]:5701 [dev] [5.0-BETA-1] Exception in ProcessorTasklet{068f-8bfa-4080-0001\/elasticSink#0} com.hazelcast.jet.JetException: failure in bulk execution: [0]: index [wikipedia], type [_doc], id [PD017XoBfeUJ26i8qT-H], message [ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=object mapping for [log_params] tried to parse field [null] as object, but found a concrete value]]]   at com.hazelcast.jet.elastic.ElasticSinkBuilder$BulkContext.lambda$flush$0(ElasticSinkBuilder.java:248)   at com.hazelcast.jet.elastic.impl.RetryUtils.withRetry(RetryUtils.java:57)   at com.hazelcast.jet.elastic.ElasticSinkBuilder$BulkContext.flush(ElasticSinkBuilder.java:244)   at com.hazelcast.function.ConsumerEx.accept(ConsumerEx.java:47)   at com.hazelcast.jet.impl.connector.WriteBufferedP.process(WriteBufferedP.java:73)   at com.hazelcast.jet.impl.processor.ProcessorWrapper.process(ProcessorWrapper.java:97)   at com.hazelcast.jet.impl.pipeline.FunctionAdapter$AdaptingProcessor.process(FunctionAdapter.java:226)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.lambda$processInbox$2f647568$2(ProcessorTasklet.java:439)   at com.hazelcast.jet.function.RunnableEx.run(RunnableEx.java:31)   at com.hazelcast.jet.impl.util.Util.doWithClassLoader(Util.java:498)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.processInbox(ProcessorTasklet.java:439)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.stateMachineStep(ProcessorTasklet.java:305)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.stateMachineStep(ProcessorTasklet.java:300)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.stateMachineStep(ProcessorTasklet.java:281)   at com.hazelcast.jet.impl.execution.ProcessorTasklet.call(ProcessorTasklet.java:255)   at com.hazelcast.jet.impl.execution.TaskletExecutionService$BlockingWorker.run(TaskletExecutionService.java:298)   at java.base\/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)   at java.base\/java.util.concurrent.FutureTask.run(FutureTask.java:264)   at java.base\/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)   at java.base\/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) \u00a0 at java.base\/java.lang.Thread.run(Thread.java:829)<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Elasticsearch.\u00a0\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u044f\u0432\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430, Elasticsearch \u0432\u044b\u0432\u0435\u043b \u0435\u0435 \u0434\u043b\u044f \u043d\u0430\u0441 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>log_params<\/code> \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code class=\"json\">\"log_params\": {   \"userid\": 108038 }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, Elasticsearch \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 JSON \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <code>userid<\/code>. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 JSON\u00a0\u043c\u0430\u0441\u0441\u0438\u0432.\u00a0Elasticsearch \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438 \u0432\u044b\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<code>\"log_params\":[]<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0438\u0431\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\u00a0\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.\u00a0\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043d\u0430\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c:<\/p>\n<pre><code class=\"kotlin\">class MakeFieldObjectIfArray(private val fieldName: String) : FunctionEx&lt;JSONObject, JSONObject> { \/\/ 1   override fun applyEx(json: JSONObject) = json.apply {           \/\/ 2     if (json.has(fieldName) &amp;&amp; json.get(fieldName) is JSONArray)  \/\/ 3       put(fieldName, JSONObject())                                \/\/ 4   } }  val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .map(MakeFieldObjectIfArray(\"log_params\"))                    \/\/ 5     .writeTo(elasticsearch) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u00a0<code>FunctionEx, <\/code>\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u00a0<code>JSONObject <\/code>\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>JSONObject<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<code>JSONObject <\/code>\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u043b\u0435\u00a0<code>JSONArray<\/code><\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0443\u0441\u0442\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c <code>JSONObject<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 <code>FunctionEx<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 &#8212; \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0441\u0431\u043e\u0435\u0432!<\/p>\n<h2>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u00ab\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c\u00bb<\/h2>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d, \u043f\u043e\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0447\u043d\u044b\u0439 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442.\u00a0\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0438\u0434\u0435\u0442 \u043f\u043e \u0434\u0432\u0443\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u0427\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u00ab\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u00bb, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043e\u043f\u044b\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f API Hazelcast. <code>GeneralStage <\/code>\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b:\u00a0<code>map()<\/code>,\u00a0<code>flatMap()<\/code>,\u00a0<code>filter() <\/code>\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435.\u00a0\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u043b\u0438 \u0431\u044b \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e\u043c,\u00a0<em>\u0447\u0442\u043e,<\/em>\u00a0\u0430 \u043d\u0435 \u043d\u0430 \u0442\u043e\u043c,\u00a0<em>\u043a\u0430\u043a<\/em>.\u00a0\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435\u00a0<code>StreamStage<\/code>\u00a0\u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>apply()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u00a0<code>StreamStage <\/code>\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 <code>StreamStage<\/code>.\u00a0\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c:<\/p>\n<pre><code class=\"kotlin\">class MakeFieldObjectIfArray(private val fieldName: String) : FunctionEx&lt;StreamStage, StreamStage> {   override fun applyEx(stage: StreamStage) = stage.map { json ->     json.apply {       if (json.has(fieldName) &amp;&amp; json.get(fieldName) is JSONArray)         put(fieldName, JSONObject())     }   } }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"kotlin\">val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .apply(MakeFieldObjectIfArray(\"log_params\"))       \/\/ 1     .writeTo(elasticsearch) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0421\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043c\u0441\u044f \u043d\u0430 \u0442\u043e\u043c, &#171;\u0447\u0442\u043e&#187;<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u00ab\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438\u00bb.\u00a0\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, &#8212; \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c Elasticsearch.\u00a0\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0448\u0435, \u0442\u0440\u0443\u0434\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0447\u0435\u043c \u043e\u043d\u0430.\u00a0\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"kotlin\">val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .apply(MakeFieldObjectIfArray(\"log_params\"))     .peek()                                           \/\/ 1     .writeTo(elasticsearch) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u041c\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430.\u00a0\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0446\u0430:<\/p>\n<pre><code class=\"kotlin\">fun sampleEvery(frequency: Int) = PredicateEx {   Random.nextInt(frequency) == 0                      \/\/ 1 }  val toStringFn = FunctionEx&lt;Any?, String> {   it?.toString()                                      \/\/ 2 }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0412\u0435\u0440\u043d\u0443\u0442\u044c,\u00a0<code>true <\/code>\u0435\u0441\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443\u00a0<code>0 <\/code>\u0438\u00a0<code>frequency <\/code>\u0440\u0430\u0432\u043d\u043e<code>0<\/code><\/p>\n<\/li>\n<li>\n<p>Null-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u00a0<code>toString()<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"kotlin\">val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .apply(MakeFieldObjectIfArray(\"log_params\"))     .peek(sampleEvery(50), toStringFn)                \/\/ 1     .writeTo(elasticsearch) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0412\u00a0<strong>\u0441\u0440\u0435\u0434\u043d\u0435\u043c<\/strong>\u00a0\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 50<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Hazelcast \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 API \u0434\u043b\u044f \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430.<\/p>\n<pre><code class=\"kotlin\">class MakeFieldObjectIfArray(private val fieldName: String) : FunctionEx {   override fun applyEx(stage: StreamStage) = stage     .setName(\"remove-log-params-if-array\")            \/\/ 1     .map { json ->       json.apply {         if (json.has(fieldName) &amp;&amp; json.get(fieldName) is JSONArray)           put(fieldName, JSONObject())       }     } }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439\u00a0\u0436\u0443\u0440\u043d\u0430\u043b\u00a0<abbr title=\"\u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u0440\u0430\u0444\">DAG<\/abbr>\u00a0:<\/p>\n<pre><code>digraph DAG {   \"replace-log-params-if-array\" [localParallelism=1];   \"replace-log-params-if-array-add-timestamps\" [localParallelism=1];   \"map\" [localParallelism=16];   \"elasticSink\" [localParallelism=2];   \"replace-log-params-if-array\" -> \"replace-log-params-if-array-add-timestamps\" [label=\"isolated\", queueSize=1024];   \"replace-log-params-if-array-add-timestamps\" -> \"map\" [queueSize=1024];   \"map\" -> \"elasticSink\" [queueSize=1024]; }<\/code><\/pre>\n<h2>\u0413\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u0413\u043b\u044f\u0434\u044f \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439,\u00a0<em>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/em>, <code>GeographBot<\/code><\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438,\u00a0<em>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/em>:<\/p>\n<ul>\n<li>\n<p><code>84.243.214.62<\/code>, \u0434\u043b\u044f IP v4<\/p>\n<\/li>\n<li>\n<p><code>240D:2:A605:7600:A1DF:B7CA:5AF8:D971<\/code>, \u0434\u043b\u044f IP v6<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u041d\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043e\u043d\u043b\u0430\u0439\u043d-API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435.\u00a0\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/www.maxmind.com\/en\/solutions\/geoip2-enterprise-product-suite\/anonymous-ip-database\" rel=\"noopener noreferrer nofollow\"><strong>\u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 MaxMind GeoIP<\/strong><\/a>.\u00a0\u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0442\u0430\u043a \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>commons-validator&lt;\/groupId>     &lt;artifactId>commons-validator&lt;\/artifactId>     &lt;version>1.7&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>com.maxmind.geoip2&lt;\/groupId>     &lt;artifactId>geoip2&lt;\/artifactId>     &lt;version>2.15.0&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">val enrichWithLocation = { stage: StreamStage ->   stage.setName(\"enrich-with-location\")                             \/\/ 1     .mapUsingService(ServiceFactories.sharedService(databaseReaderSupplier)) { reader: DatabaseReader, json: JSONObject ->        json.apply {          if (!json.optBoolean(\"bot\") &amp;&amp; json.has(\"user\")) {         \/\/ 2            val user = json.getString(\"user\")            if (InetAddressValidator.getInstance().isValid(user)) {  \/\/ 3              reader.tryCity(InetAddress.getByName(user))            \/\/ 4                    .ifPresent { json.withLocationFrom(it) }         \/\/ 5            }          }       }     } }  val pipeline = Pipeline.create().apply {   readFrom(wikipedia)     .withTimestamps({ it.getLong(\"timestamp\") }, 100)     .apply(MakeFieldObjectIfArray(\"log_params\"))     .apply(enrichWithLocation)                                      \/\/ 6     .peek(sampleEvery(50), toStringFn)     .writeTo(elasticsearch) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u043e\u0442\u0430 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 false \u0438 \u0435\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e IP-\u0430\u0434\u0440\u0435\u0441, v4 \u0438\u043b\u0438 v6<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u044f IP<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 JSON<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/p>\n<\/li>\n<\/ol>\n<h2>\u041d\u0430\u0448\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0418\u043c\u0435\u044f \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043c\u0438\u0440\u0430. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: Kibana \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 Analytics > Maps.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Add Layer&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Documents.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435\u00a0<code>wikipedia<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u041a\u0438\u0431\u0430\u043d\u0430 \u0436\u0430\u043b\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0433\u0435\u043e\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439!<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0445\u043e\u0442\u044f \u043c\u044b \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0448\u0438\u0440\u043e\u0442\u043e\u0439 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u043e\u0439, Elasticsearch \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u0438\u0445 \u043a\u0430\u043a \u0442\u0438\u043f Geo-Point. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u044d\u0442\u043e. \u0425\u0443\u0436\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044f. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 Management > Stack Management.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Data > Index Management.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 <code>wikipedia<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Manage Index&#187;. <\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Delete index.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430\u043d\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443.<\/p>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 Management | Stack Management<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Data | Index Management<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 Index Template (3-\u044f)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Create template&#187;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0439\u0442\u0435 \u0435\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0438\u043c\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>geo-locate<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>wikipedia<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>wikipedia<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Next&#187;, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u0442\u0435 \u0434\u043e 4-\u0433\u043e \u0448\u0430\u0433\u0430 \u2013 Mappings.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>location.coordinates<\/code> \u0438 \u0442\u0438\u043f\u043e\u043c Geo-point.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0439\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;Next&#187; \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0448\u0430\u0433\u0430. \u041d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 JSON:<\/p>\n<pre><code class=\"json\">{   \"template\": {     \"settings\": {},     \"mappings\": {       \"properties\": {         \"location\": {           \"properties\": {             \"coordinates\": {               \"type\": \"geo_point\"             }           }         }       }     },     \"aliases\": {}   } }<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u00bb.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 <code>wikipedia <\/code>Elasticsearch \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>coordinates <\/code>\u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>location<\/code> \u0441 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u200b\u200b\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"kotlin\">private fun JSONObject.withLocationFrom(response: CityResponse) {     val country = JSONObject()         .put(\"iso\", response.country.isoCode)         .put(\"name\", response.country.name)     val coordinates = JSONArray()         .put(response.location.longitude)         .put(response.location.latitude)     val location = JSONObject()         .put(\"country\", country)         .put(\"coordinates\", coordinates)         .put(\"city\", response.city.name)         .put(\"timezone\", response.location.timeZone)         .put(\"accuracy-radius\", response.location.accuracyRadius)     put(\"location\", location) }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435:<\/p>\n<pre><code class=\"kotlin\">reader.tryCity(InetAddress.getByName(user)) \u00a0 \u00a0 .ifPresent { json.withLocationFrom(it) }<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0448\u0430\u0433\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u0430\u0440\u0442\u044b. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043e\u043d \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u0442 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043d\u0430\u043d\u0435\u0441\u043b\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443 \u043a\u0430\u043a \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. <\/p>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00abAdd layer\u00bb \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0433\u043b\u0443. \u0412\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/p>\n<h2>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <\/h2>\n<p>\u0422\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0438\u0445 \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u00a0<code>meta.uri<\/code>\u00a0\u0438\u00a0<code>comment<\/code>. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0439 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0449\u0435\u043b\u043a\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/8ff\/c0a\/f50\/8ffc0af50b2cf5723210a28ec9444910.jpg\" width=\"1995\" height=\"1195\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8ff\/c0a\/f50\/8ffc0af50b2cf5723210a28ec9444910.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f &#8212; \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443.\u00a0\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c\u0438 (\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b), \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0438 \u0434\u043d\u044f.\u00a0\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0440\u0438\u043f\u043b\u0435\u0442 article-language-location \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0444\u043b\u0430\u0436\u043a\u0438.\u00a0\u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<code>meta.uri <\/code>\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044f\u0437\u044b\u043a.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430:<\/p>\n<ol>\n<li>\n<p>\u0418\u0437 URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, it.wikipedia.org \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439, \u0430 fr.wikipedia.org \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f (\u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439)<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439.\u00a0\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u0435 <code>comment<\/code>.\u00a0\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>&#171;Anagrames [[esgota]], [[esgot\u00e0]], m\u00e9s canvis cosm\u00e8tics&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;Added location template&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;[[:\u5091\u514b\u00b7\u5a01\u723e\u8a31]]\u5df2\u6dfb\u52a0\u81f3\u5206\u7c7b\uff0c[[Special:WhatLinksHere\/\u5091\u514b\u00b7\u5a01\u723e\u8a31|\u6b64\u9875\u9762\u5305\u542b\u5728\u5176\u4ed6\u9875\u9762\u4e4b\u5185]]&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;\/* wbsetdescription-add:1|ru *\/ \u043f\u0440\u043e\u0432\u0438\u043d\u0446\u0438\u044f \u0410\u043b\u0436\u0438\u0440\u0430&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;\/* Treindiensten *\/&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;\u05d9\u05e6\u05d9\u05e8\u05ea \u05d3\u05e3 \u05e2\u05dd \u05d4\u05ea\u05d5\u05db\u05df \\&#187;\u05d0\u05e1\u05e3 \\&#187;\u05d1\u05d5\u05d1\u05d9\\&#187; \u05de\u05e8\u05d5\u05d6, \u05d9\u05dc\u05d9\u05d3 \u05d7\u05d9\u05e4\u05d4, \u05d4\u05d9\u05e0\u05d5 \u05de\u05d5\u05d6\u05d9\u05e7\u05d0\u05d9, \u05de\u05ea\u05d5\u05e4\u05e3, \u05d7\u05d1\u05e8 \u05d1\u05dc\u05d4\u05e7\u05d5\u05ea \u05d0\u05d1\u05d8\u05d9\u05e4\u05d5\u05e1, \u05e7\u05d9\u05dc\u05e8 \u05d5\u05d0\u05d9\u05e4\u05d4 \u05d4\u05d9\u05dc\u05d3 == \u05d4\u05e8\u05db\u05d1\u05d9\u05dd == === \u05e7\u05d9\u05dc\u05e8 \u05d4\u05dc\u05d5\u05d4\u05d8\u05ea === \u05d1\u05e9\u05e0\u05ea 1980 &#8212; \u05e9\u05d9\u05de\u05e9 \u05de\u05ea\u05d5\u05e4\u05e3 \u05e9\u05dc \u05d4\u05dc\u05d4\u05e7\u05d4 \u05e7\u05d9\u05dc\u05e8 \u05d4\u05dc\u05d5\u05d4\u05d8\u05ea. === \u05d0\u05d1\u05d8\u05d9\u05e4\u05d5\u05e1 === \u05d4\u05dc\u05d4\u05e7\u05d4 \u05d4\u05d5\u05e7\u05de\u05d4 \u05d1[[\u05e7\u05e8\u05d9\u05d5\u05ea]] \u05d1\u05d0\u05de\u05e6\u05e2 [[\u05e9\u05e0\u05d5\u05ea \u05d4\u05e9\u05de\u05d5\u05e0\u05d9\u05dd]] \u05d5\u05e2\u05d1\u05e8\u05d4 \u05d2\u05dc\u05d2\u05d5\u05dc\u05d9 \u05d4\u05e8\u05db\u05d1 \u05e9\u05d5\u05e0\u05d9\u05dd. \u05d1\u05d2\u05dc\u05d2\u05d5\u05dc\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05df \u05d1\u05e9\u05e0\u05ea&#8230;\\&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;{{tham kh\u1ea3o|2}} \u2192 {{tham kh\u1ea3o|30em}}&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;Mooier wordt het er niet van.&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;[[:\u041a\u043e\u043d\u0443\u043a\u043b\u0430\u0440 (\u0414\u0436\u0438\u0434\u0435)]] \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438 \u0447\u0443 \u0442\u043e\u044c\u0445\u043d\u0430&#187;<\/p>\n<\/li>\n<li>\n<p>\u0418 \u0442.\u043f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041b\u0438\u043d\u0433\u0432\u0438\u0441\u0442 \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043e \u044f\u0437\u044b\u043a\u0435 \u043f\u043e\u043b\u044f.\u00a0\u0422\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435.\u00a0\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u00a0<abbr title=\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430\">NLP<\/abbr>\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 JVM, \u043d\u043e \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0<a href=\"https:\/\/github.com\/pemistahl\/lingua\" rel=\"noopener noreferrer nofollow\"><strong>Lingua<\/strong><\/a>, \u043e\u0434\u043d\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432.<\/p>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"kotlin\">val languageDetectorSupplier = { _: ProcessorSupplier.Context ->     LanguageDetectorBuilder         .fromAllSpokenLanguages()         .build() }                                                                        \/\/ 1  val enrichWithLanguage = { stage: StreamStage&lt;JSONObject> ->     stage.setName(\"enrich-with-language\")         .mapUsingService(ServiceFactories.sharedService(languageDetectorSupplier)) { detector: LanguageDetector, json: JSONObject ->             json.apply {                 val comment = json.optString(\"comment\")                 if (comment.isNotEmpty()) {                     val language = detector.detectLanguageOf(comment)   \/\/ 2                     if (language != Language.UNKNOWN) {                         json.put(                             \"language\", JSONObject()                    \/\/ 3                                 .put(\"code2\", language.isoCode639_1)                                 .put(\"code3\", language.isoCode639_3)                                 .put(\"name\", language.name)                         )                     }                 }             }         } }<\/code><\/pre>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 <\/p>\n<\/li>\n<li>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0433\u0438\u044f <\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044f\u0437\u044b\u043a\u043e\u043c, \u0432 JSON <\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435:<\/p>\n<pre><code class=\"kotlin\">val pipeline = Pipeline.create().apply {         readFrom(wikipedia)             .withTimestamps({ it.getLong(\"timestamp\") }, 100)             .apply(MakeFieldObjectIfArray(\"log_params\"))             .apply(enrichWithLocation)             .apply(enrichWithLanguage)             .peek(sampleEvery(50), toStringFn)             .writeTo(elasticsearch) \u00a0 \u00a0 }<\/code><\/pre>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0435 Kibana \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044f, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044f\u0437\u044b\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>language.name<\/code>,\u00a0\u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0435\u00a0\u043f\u043e\u043b\u0435 <code>comment<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f\u0437\u044b\u043a \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f.\u00a0\u041e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 Kibana.\u00a0\u0412 \u043e\u0431\u0449\u0435\u043c, \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c: \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u0445\u043e\u0442\u044f\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c KQL \u0444\u0438\u043b\u044c\u0442\u0440,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u0435\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:\u00a0<code>language.name\u00a0:\u00a0*<\/code>.\u00a0\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d78\/a7c\/8bc\/d78a7c8bc1c28b51a4211124cf74b46a.png\" width=\"1176\" height=\"524\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d78\/a7c\/8bc\/d78a7c8bc1c28b51a4211124cf74b46a.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0423\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0423\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u0445\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u00abNgfn\u00bb &#8212; \u044d\u0442\u043e \u043d\u0435 Sotho, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u00ab\u0421\u044e\u0436\u0435\u0442\u00bb \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c\u00a0<a href=\"https:\/\/en.wiktionary.org\/wiki\/%D1%81%D1%8E%D0%B6%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\"><strong>\u0431\u043e\u043b\u0433\u0430\u0440\u0441\u043a\u0438\u043c, \u043a\u0430\u0437\u0430\u0445\u0441\u043a\u0438\u043c \u0438\u043b\u0438 \u0440\u0443\u0441\u0441\u043a\u0438\u043c<\/strong><\/a>, \u043d\u043e \u043d\u0435 \u043c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u043a\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0425\u043e\u0442\u044f Lingua \u0438\u043c\u0435\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043e\u043d\u0430 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430\u043c.\u00a0\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, Lingua \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044f\u0437\u044b\u043a \u0438\u0437 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043a\u0430\u0440\u0442\u044b \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438.\u00a0\u041f\u0435\u0440\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 1,0;\u00a0\u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 0,0 \u0434\u043e 1,0.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u00abNuf\u00fcs\u00bb \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443:<\/p>\n<ul>\n<li>\n<p>1.0: \u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>0.762256422055537: \u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>0.6951232183399704: Azerba\u00efjani<\/p>\n<\/li>\n<li>\n<p>0.6670947340824422: \u044d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>0.5291088632328994: \u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>0.36574326772623783: \u043a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043a 1, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0434\u043e\u0432\u0435\u0440\u0438\u0435 \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u044d\u0442\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u043c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438 1.0. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"kotlin\">val languagesWithConfidence = detector.computeLanguageConfidenceValues(comment)             \/\/ 1 if (languagesWithConfidence.isNotEmpty()) {     val mostLikelyLanguage = languagesWithConfidence.firstKey()     val secondMostLikelyConfidence = languagesWithConfidence.filterNot { it.key == mostLikelyLanguage }.maxBy { it.value }?.value ?: 0.0 \/\/ 2     json.put(         \"language\", JSONObject()             .put(\"code2\", mostLikelyLanguage.isoCode639_1)             .put(\"code3\", mostLikelyLanguage.isoCode639_3)             .put(\"name\", mostLikelyLanguage.name)             .put(\"confidence\", 1.0 - secondMostLikelyConfidence)                                 \/\/ 3     ) }<\/code><\/pre>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u044f\u0437\u044b\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438\u043b\u0438 0, \u0435\u0441\u043b\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0435\u0441\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <\/p>\n<\/li>\n<li>\n<p> \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0439\u0442\u0438\u043d\u0433 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u0435 <code>language.confidence<\/code> \u0442\u0438\u043f\u0430 int, \u0442. \u0435. 0 \u0438\u043b\u0438 1. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u0430 <code>Double<\/code>, \u043a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u044b\u0448\u0435 \u0441 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>language.name : * \u0438 language.confidence > 0.2<\/code>.<\/p>\n<p>\u0412\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/754\/7bf\/5a8\/7547bf5a8f2f6b627525c29a6d4e2d0f.png\" width=\"1176\" height=\"524\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/754\/7bf\/5a8\/7547bf5a8f2f6b627525c29a6d4e2d0f.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Hazelcast \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 Kibana \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.\u00a0\u0414\u043b\u044f Kibana \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043d\u0430\u0432\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 &#8212; \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u043d\u0430\u0432\u044b\u043a\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\u00a0\u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u043c \u043f\u043e Python \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u0431\u043e\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c JVM.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441!<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u00a0<a href=\"https:\/\/github.com\/hazelcast-demos\/wikipedia-changes\" rel=\"noopener noreferrer nofollow\"><strong>GitHub<\/strong><\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/587092\/\"> https:\/\/habr.com\/ru\/articles\/587092\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0432\u0441\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0430\u0443\u043a\u0438 \u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u044e\u0434\u044c\u043c\u0438.\u00a0Python, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u044b\u043c\u0438 \u043c\u043e\u0449\u043d\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043d\u043e \u043d\u0435 \u0442\u0435\u0440\u044f\u0439\u0442\u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a Java (\u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c).\u00a0<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043d\u0438 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430, \u043b\u0438\u0448\u044c \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/h2>\n<p>\u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u00a0<a href=\"https:\/\/wikipedia.org\/\" rel=\"noopener noreferrer nofollow\"><strong>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0435\u0439<\/strong><\/a>.\u00a0\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f &#8212; \u044d\u0442\u043e \u043e\u043d\u043b\u0430\u0439\u043d \u044d\u043d\u0446\u0438\u043a\u043b\u043e\u043f\u0435\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e.\u00a0\u041f\u043e \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c:<\/p>\n<blockquote>\n<p><em>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f &#8212; \u044d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u0447\u043d\u0430\u044f \u043e\u043d\u043b\u0430\u0439\u043d \u044d\u043d\u0446\u0438\u043a\u043b\u043e\u043f\u0435\u0434\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u0446\u0435\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0438\u043a\u0438.<\/em><\/p>\n<\/blockquote>\n<p>\u0412\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0435 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Wikipedia\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u0442\u0430\u0442\u044c\u0438<\/strong><\/a>\u00a0\u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438.\u00a0\u041e\u0447\u0435\u043d\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u043d\u043e.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u0443 \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0442\u0435\u043c\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 \u0440\u0435\u0448\u0430\u0442\u044c, \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u0439 &#8212; \u0438\u043b\u0438 \u043d\u0435\u0442.\u00a0\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0430\u043a \u0432\u0441\u0435\u043c\u0438\u0440\u043d\u044b\u0439 Git \u043e\u0431\u0437\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0414\u0430\u0436\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u043f\u043e\u0441\u044b\u043b\u0430\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u0447\u043b\u0435\u043d\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0432 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u0430, \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0439 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0448 IP-\u0430\u0434\u0440\u0435\u0441. IP \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043c\u0435\u043d\u0438 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443.\u00a0\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u0440\u043e\u0447\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u0447\u0435\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c, \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u044b\u0432\u043e\u0434 \u043e \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0435\u0440\u0443 \u044f\u0437\u044b\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043a\u0430\u0436\u0443 \u0438\u0445 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043c\u0438\u0440\u0430.\u00a0\u0417\u0430\u0442\u0435\u043c \u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u044f\u0437\u044b\u043a \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443.<\/p>\n<p>\u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0447\u044c \u044d\u0442\u043e, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443.<\/p>\n<h2>\u041d\u0430\u043d\u0435\u0441\u0435\u043c \u0432\u0438\u0437\u0438\u0442 \u0432 \u043c\u0438\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 &#8212; \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435,\u00a0\u00a0<em>\u0442\u043e \u0435\u0441\u0442\u044c<\/em>\u00a0\u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0432 \u043d\u0430\u0448\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0<\/p>\n<p>\u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c\u0430 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u00a0\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Special:RecentChanges\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/strong><\/a>.\u00a0<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0436\u043c\u0435\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u00ab\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0438\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043d\u0435\u043c\u0443).\u00a0\u0412\u043e\u0442 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Hazelcast.\u00a0\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c,\u00a0<a href=\"https:\/\/github.com\/hazelcast-demos\/wikipedia-changes\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub<\/strong><\/a>.<\/p>\n<p>\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c\u00a0<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Server-sent_events\" rel=\"noopener noreferrer nofollow\"><strong>\u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c<\/strong><\/a>.\u00a0\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0<abbr title=\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f\">\u0432\u0435\u0440\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f&#187;>SSE<\/abbr>\u00a0(Server-Sent Events) \u0432\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.\u00a0\u041d\u0430\u00a0<abbr title=\"\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 Java\">\u0430\u0448\u0438\u043d\u0430 Java&#187;>JVM<\/abbr>\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e SSE-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Spring WebClient.\u00a0\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/launchdarkly\/okhttp-eventsource\" rel=\"noopener noreferrer nofollow\"><strong>OkHttp EventSource,<\/strong><\/a>\u00a0\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043b\u0435\u0433\u043a\u0438\u0439 &#8212; \u043e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 OkHttp \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>\u0412\u043e\u0442 \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 POM:<\/p>\n<pre><code class=\"xml\">&lt;dependency>     &lt;groupId>com.hazelcast&lt;\/groupId>     &lt;artifactId>hazelcast&lt;\/artifactId>     &lt;version>${hazelcast.version}&lt;\/version> &lt;\/dependency> &lt;dependency>     &lt;groupId>com.launchdarkly&lt;\/groupId>     &lt;artifactId>okhttp-eventsource&lt;\/artifactId>     &lt;version>2.3.2&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<h2>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <\/h2>\n<p>\u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Hazelcast \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.\u00a0\u0421 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 HTTP \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0441 SSE \u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 SSE \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439\u00a0<code>Source <\/code>\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043e\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0443.<\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<ul>\n<li>\n<p><code>Context <\/code>\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439.\u00a0\u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439\u00a0\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>WikipediaChangeEventHandler <\/code>\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 SSE.<\/p>\n<\/li>\n<li>\n<p><code>WikipediaChangeEventHandler<\/code> &#8212; \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438.\u00a0\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043e\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u0432 \u0441\u0432\u043e\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0432\u0438\u0436\u043e\u043a Hazelcast \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<code>Call <\/code>\u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 <code>WikipediaChangeEventHandler<\/code>, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 <code>JSONObject <\/code>\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"json\">{\"server_script_path\":\"\/w\",\"server_name\":\"en.wikipedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":false,\"wiki\":\"enwiki\",\"type\":\"categorize\",\"title\":\"Category:Biography articles without listas parameter\",\"meta\":{\"dt\":\"2021-07-28T04:07:40Z\",\"partition\":0,\"offset\":363427323,\"stream\":\"mediawiki.recentchange\",\"domain\":\"en.wikipedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"01592c7a-03f1-46cd-9472-3bbe63aff0ec\",\"uri\":\"https:\/\/en.wikipedia.org\/wiki\/Category:Biography_articles_without_listas_parameter\",\"request_id\":\"b49c3b98-2064-44da-aab4-ab7b3bf65bdd\"},\"namespace\":14,\"comment\":\"[[:Talk:Jeff S. Klotz]] removed from category\",\"id\":1406951122,\"server_url\":\"https:\/\/en.wikipedia.org\",\"user\":\"Lepricavark\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/Talk:Jeff_S._Klotz\\\" title=\\\"Talk:Jeff S. Klotz\\\">Talk:Jeff S. Klotz&lt;\\\/a> removed from category\",\"timestamp\":1627445260} {\"server_script_path\":\"\/w\",\"server_name\":\"commons.wikimedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":true,\"wiki\":\"commonswiki\",\"type\":\"categorize\",\"title\":\"Category:Flickr images reviewed by FlickreviewR 2\",\"meta\":{\"dt\":\"2021-07-28T04:07:42Z\",\"partition\":0,\"offset\":363427324,\"stream\":\"mediawiki.recentchange\",\"domain\":\"commons.wikimedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"68f3a372-112d-4dae-af8f-25d88984f1d8\",\"uri\":\"https:\/\/commons.wikimedia.org\/wiki\/Category:Flickr_images_reviewed_by_FlickreviewR_2\",\"request_id\":\"1a132610-85e0-4954-9329-9e44691970aa\"},\"namespace\":14,\"comment\":\"[[:File:Red squirrel (51205279267).jpg]] added to category\",\"id\":1729953358,\"server_url\":\"https:\/\/commons.wikimedia.org\",\"user\":\"FlickreviewR 2\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/File:Red_squirrel_(51205279267).jpg\\\" title=\\\"File:Red squirrel (51205279267).jpg\\\">File:Red squirrel (51205279267).jpg&lt;\\\/a> added to category\",\"timestamp\":1627445262} {\"server_script_path\":\"\/w\",\"server_name\":\"commons.wikimedia.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"bot\":true,\"wiki\":\"commonswiki\",\"type\":\"categorize\",\"title\":\"Category:Flickr review needed\",\"meta\":{\"dt\":\"2021-07-28T04:07:42Z\",\"partition\":0,\"offset\":363427325,\"stream\":\"mediawiki.recentchange\",\"domain\":\"commons.wikimedia.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"b4563ed9-a6f2-40de-9e71-c053f5352846\",\"uri\":\"https:\/\/commons.wikimedia.org\/wiki\/Category:Flickr_review_needed\",\"request_id\":\"1a132610-85e0-4954-9329-9e44691970aa\"},\"namespace\":14,\"comment\":\"[[:File:Red squirrel (51205279267).jpg]] removed from category\",\"id\":1729953359,\"server_url\":\"https:\/\/commons.wikimedia.org\",\"user\":\"FlickreviewR 2\",\"parsedcomment\":\"&lt;a href=\\\"\/wiki\/File:Red_squirrel_(51205279267).jpg\\\" title=\\\"File:Red squirrel (51205279267).jpg\\\">File:Red squirrel (51205279267).jpg&lt;\\\/a> removed from category\",\"timestamp\":1627445262} {\"server_script_path\":\"\/w\",\"server_name\":\"www.wikidata.org\",\"$schema\":\"\/mediawiki\/recentchange\/1.0.0\",\"minor\":false,\"bot\":true,\"wiki\":\"wikidatawiki\",\"length\":{\"new\":31968,\"old\":31909},\"type\":\"edit\",\"title\":\"Q40652\",\"revision\":{\"new\":1468164253,\"old\":1446892882},\"patrolled\":true,\"meta\":{\"dt\":\"2021-07-28T04:07:43Z\",\"partition\":0,\"offset\":363427326,\"stream\":\"mediawiki.recentchange\",\"domain\":\"www.wikidata.org\",\"topic\":\"codfw.mediawiki.recentchange\",\"id\":\"70784dde-0360-4292-9f62-81323ced9aa7\",\"uri\":\"https:\/\/www.wikidata.org\/wiki\/Q40652\",\"request_id\":\"f9686303-ffed-4c62-8532-bf870288ff55\"},\"namespace\":0,\"comment\":\"\/* wbsetaliases-add:1|zh *\/ \u8482\u6258, [[User:Cewbot#Import labels\/aliases|import label\/alias]] from [[zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a]], [[zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14]], [[zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae]], [[zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510]], [[zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229]], [[zh:2019\u5e74\u5357\u7f8e\u8d85\u7ea7\u5fb7\u6bd4\u676f]], [[zh:2019\u5e74\u7f8e\u6d32\u676f\u51b3\u8d5b]], [[zh:2019\u5e74\u7f8e\u6d32\u676f\u53c2\u8d5b\u540d\u5355]], [[zh:2021\u5e74\u7f8e\u6d32\u676fB\u7ec4]], [[zh:2021\u5e74\u7f8e\u6d32\u570b\u5bb6\u76c3\u6c7a\u8cfd]]\",\"id\":1514670479,\"server_url\":\"https:\/\/www.wikidata.org\",\"user\":\"Cewbot\",\"parsedcomment\":\"\\u200e&lt;span dir=\\\"auto\\\">&lt;span class=\\\"autocomment\\\">Added Chinese alias: &lt;\\\/span>&lt;\\\/span> \u8482\u6258, &lt;a href=\\\"\/wiki\/User:Cewbot#Import_labels\/aliases\\\" title=\\\"User:Cewbot\\\">import label\/alias&lt;\\\/a> from &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%B7%B4%E8%A5%BF%E5%9C%8B%E5%AE%B6%E8%B6%B3%E7%90%83%E9%9A%8A\\\" class=\\\"extiw\\\" title=\\\"zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a\\\">zh:\u5df4\u897f\u570b\u5bb6\u8db3\u7403\u968a&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E4%BD%95%E5%A1%9E%C2%B7%E4%BF%9D%E7%BD%97%C2%B7%E8%B4%9D%E5%A1%9E%E6%8B%89%C2%B7%E9%A9%AC%E5%B8%8C%E5%B0%94%C2%B7%E5%84%92%E5%B0%BC%E5%A5%A5%E5%B0%94\\\" class=\\\"extiw\\\" title=\\\"zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14\\\">zh:\u4f55\u585e\u00b7\u4fdd\u7f57\u00b7\u8d1d\u585e\u62c9\u00b7\u9a6c\u5e0c\u5c14\u00b7\u5112\u5c3c\u5965\u5c14&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/2018%E5%B9%B4%E5%9C%8B%E9%9A%9B%E8%B6%B3%E5%8D%94%E4%B8%96%E7%95%8C%E7%9B%83%E5%8F%83%E8%B3%BD%E7%90%83%E5%93%A1%E5%90%8D%E5%96%AE\\\" class=\\\"extiw\\\" title=\\\"zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae\\\">zh:2018\u5e74\u570b\u969b\u8db3\u5354\u4e16\u754c\u76c3\u53c3\u8cfd\u7403\u54e1\u540d\u55ae&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%9F%83%E5%BE%B7%E7%88%BE%C2%B7%E7%B1%B3%E5%88%A9%E5%94%90\\\" class=\\\"extiw\\\" title=\\\"zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510\\\">zh:\u57c3\u5fb7\u723e\u00b7\u7c73\u5229\u5510&lt;\\\/a>, &lt;a href=\\\"https:\/\/zh.wikipedia.org\/wiki\/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%E7%88%BE%C2%B7%E9%A6%AC%E4%B8%81%E5%85%A7%E5%88%A9\\\" class=\\\"extiw\\\" title=\\\"zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229\\\">zh:\u52a0\u5e03\u91cc\u57c3\u723e\u00b7\u99ac\u4e01\u5167\u5229&lt;\\\/a>, &lt;a<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-404785","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/404785","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=404785"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/404785\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=404785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=404785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=404785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}