<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[lanmaster's blog]]></title><description><![CDATA[Заметки]]></description><link>https://lanmaster.su/</link><image><url>https://lanmaster.su/favicon.png</url><title>lanmaster&apos;s blog</title><link>https://lanmaster.su/</link></image><generator>Ghost 4.3</generator><lastBuildDate>Fri, 25 Jul 2025 06:04:11 GMT</lastBuildDate><atom:link href="https://lanmaster.su/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[CentOS 7. Замена диска в raid.]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x438;&#x448;&#x43B;&#x43E; &#x433;&#x440;&#x443;&#x441;&#x442;&#x43D;&#x43E;&#x435; &#x43F;&#x438;&#x441;&#x44C;&#x43C;&#x43E;:</p><pre><code>This message was generated by the smartd daemon running on:
   host name:  lanmaster
   DNS domain: su
The following warning/error was logged by the smartd daemon:
Device: /dev/sda [SAT]</code></pre>]]></description><link>https://lanmaster.su/centos-7-zamiena-diska-v-raid-0/</link><guid isPermaLink="false">608b071859a263000122fd8d</guid><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Sat, 01 May 2021 07:28:10 GMT</pubDate><content:encoded><![CDATA[<p>&#x41F;&#x440;&#x438;&#x448;&#x43B;&#x43E; &#x433;&#x440;&#x443;&#x441;&#x442;&#x43D;&#x43E;&#x435; &#x43F;&#x438;&#x441;&#x44C;&#x43C;&#x43E;:</p><pre><code>This message was generated by the smartd daemon running on:
   host name:  lanmaster
   DNS domain: su
The following warning/error was logged by the smartd daemon:
Device: /dev/sda [SAT], 8 Currently unreadable (pending) sectors
Device info:
TOSHIBA HDWD110, S/N:Y5DA3S0FS, WWN:5-000039-fe7c499c2, FW:MS2OA8J0, 1.00 TB</code></pre><p>&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x441;&#x430;&#x43C;&#x43E;&#x434;&#x438;&#x430;&#x433;&#x43D;&#x43E;&#x441;&#x442;&#x438;&#x43A;&#x438; &#x434;&#x438;&#x441;&#x43A;&#x430; &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x430;&#x43B;, &#x447;&#x442;&#x43E; &#x432; &#x43F;&#x438;&#x441;&#x44C;&#x43C;&#x435; &#x43F;&#x440;&#x430;&#x432;&#x434;&#x430;. &#x41F;&#x440;&#x438;&#x434;&#x435;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C; &#x434;&#x438;&#x441;&#x43A;. &#x41A;&#x443;&#x43F;&#x438;&#x43B; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x436;&#x435; &#x43F;&#x43E; &#x433;&#x435;&#x43E;&#x43C;&#x435;&#x442;&#x440;&#x438;&#x438;, &#x43C;&#x430;&#x440;&#x43A;&#x438;&#x440;&#x43E;&#x432;&#x43A;&#x435; &#x438; &#x435;&#x43C;&#x43A;&#x43E;&#x441;&#x442;&#x438;, &#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x431;&#x44B;&#x43B;. &#x414;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x432;&#x44B;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x43B; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x438; &#x43F;&#x43E;&#x43B;&#x435;&#x437; &#x433;&#x443;&#x433;&#x43B;&#x438;&#x442;&#x44C;, &#x43A;&#x430;&#x43A; &#x44D;&#x442;&#x43E; &#x432;&#x441;&#x435; &#x434;&#x435;&#x43B;&#x430;&#x435;&#x442;&#x441;&#x44F;. </p><p>&#x41F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;: &#x435;&#x441;&#x442;&#x44C; &#x447;&#x435;&#x442;&#x44B;&#x440;&#x435; &#x433;&#x43D;&#x435;&#x437;&#x434;&#x430; &#x43F;&#x43E;&#x434; &#x434;&#x438;&#x441;&#x43A;&#x438;:<br>1 - /dev/sda<br>2- /dev/sdc (&#x43D;&#x435; &#x43F;&#x43E;&#x43C;&#x43D;&#x44E; &#x443;&#x436;&#x435;, &#x437;&#x430;&#x447;&#x435;&#x43C; &#x43F;&#x435;&#x440;&#x435;&#x43F;&#x443;&#x442;&#x430;&#x43D;&#x44B; &#x43C;&#x435;&#x441;&#x442;&#x430;&#x43C;&#x438; sdb &#x438; sdc, &#x43D;&#x43E; &#x43F;&#x443;&#x441;&#x442;&#x44C; &#x431;&#x443;&#x434;&#x435;&#x442; &#x442;&#x430;&#x43A;)<br>3- /dev/sdb - &#x441;&#x430;&#x43C; &#x43F;&#x43E; &#x441;&#x435;&#x431;&#x435;, &#x43D;&#x435; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x432; raid<br>4 - &#x43F;&#x443;&#x441;&#x442;&#x43E;</p><p>&#x417;&#x430;&#x447;&#x435;&#x43C;-&#x442;&#x43E; &#x441;&#x440;&#x430;&#x437;&#x443; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x43B; &#x434;&#x43E;&#x445;&#x43B;&#x44B;&#x439; &#x434;&#x438;&#x441;&#x43A; &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x432; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x43C; &#x433;&#x43D;&#x435;&#x437;&#x434;&#x435;. &#x421;&#x435;&#x440;&#x432;&#x435;&#x440; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x430;&#x43B;&#x441;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C;&#x441;&#x44F;, &#x44F;&#x43A;&#x43E;&#x431;&#x44B; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x434;&#x438;&#x441;&#x43A;&#x430;. &#x41D;&#x443; &#x43B;&#x43E;&#x433;&#x438;&#x447;&#x43D;&#x43E; &#x432;&#x440;&#x43E;&#x434;&#x435; &#x431;&#x44B;, &#x432;&#x435;&#x434;&#x44C; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x430; &#x448;&#x43B;&#x430; &#x43A;&#x430;&#x43A; &#x440;&#x430;&#x437; &#x441; <code>/dev/sda</code>. &#x41F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x431;&#x44B;&#x432;&#x448;&#x438;&#x439; <code>sda</code> &#x438;&#x437; &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x433;&#x43D;&#x435;&#x437;&#x434;&#x430; &#x432; &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439;. &#x412;&#x43E; &#x432;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x434;&#x43E;&#x43A; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x434;&#x438;&#x441;&#x43A;.<br>&#x417;&#x430;&#x433;&#x440;&#x443;&#x437;&#x438;&#x43B;&#x43E;&#x441;&#x44C;. &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x438;&#x434;&#x435;&#x43D; <code>degraded raid</code>, &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x438;&#x439; &#x438;&#x437; sda (&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x431;&#x44B;&#x432;&#x448;&#x438;&#x439; sdc). </p><p>&#x414;&#x430;&#x43B;&#x44C;&#x448;&#x435; &#x434;&#x435;&#x43B;&#x430;&#x43B; &#x43F;&#x43E; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x44F;&#x43C;: <a href="https://my.fairyhosting.com/index.php?rp=%2Fknowledgebase%2F334%2F&#x417;&#x430;&#x43C;&#x435;&#x43D;&#x430;-&#x434;&#x438;&#x441;&#x43A;&#x430;-&#x432;-Software-RAID1-Linux.html&amp;language=swedish">&#x442;&#x443;&#x442;</a> &#x438; <a href="https://www.thegeekdiary.com/replacing-a-failed-mirror-disk-in-a-software-raid-array-mdadm/">&#x442;&#x443;&#x442;</a><br>&#x418;&#x43D;&#x444;&#x430; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x430;&#x43C; &#x43D;&#x430; &#x440;&#x430;&#x439;&#x434;&#x435; - &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;</p><blockquote>mdadm --detail /dev/md0<br>mdadm --detail /dev/md1<br>mdadm --detail /dev/md2</blockquote><p>&#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x43E;&#x432;</p><blockquote>[root@lanmaster ~]# sfdisk -l /dev/sda<br>&#x414;&#x438;&#x441;&#x43A; /dev/sda: 121601 &#x446;&#x438;&#x43B;&#x438;&#x43D;&#x434;&#x440;&#x43E;&#x432;, 255 &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43E;&#x43A;, 63 &#x441;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x43E;&#x432;/&#x434;&#x43E;&#x440;&#x43E;&#x436;&#x43A;&#x443;<br>Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0<br><br>&#x423;&#x441;&#x442;&#x440;-&#x432;&#x43E; &#x417;&#x430;&#x433;&#x440; &#xA0; &#x41D;&#x430;&#x447; &#xA0; &#x41A;&#x43E;&#x43D;&#x435;&#x446; &#xA0; &#xA0;#&#x446;&#x438;&#x43B; &#xA0; &#xA0; #&#x431;&#x43B;&#x43E;&#x43A;&#x438; &#xA0; Id &#xA0;&#x421;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430;<br>/dev/sda1 &#xA0; * &#xA0; &#xA0; &#xA0;0+ &#xA0; &#xA0; 63- &#xA0; &#xA0; 64- &#xA0; &#xA0;512000 &#xA0; fd &#xA0;&#x410;&#x432;&#x442;&#x43E;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; Linux raid<br>/dev/sda2 &#xA0; &#xA0; &#xA0; &#xA0; 63+ 113952- 113889- 914808832 &#xA0; fd &#xA0;&#x410;&#x432;&#x442;&#x43E;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; Linux raid<br>sfdisk: &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#x43A;&#x43E;&#x43D;&#x435;&#x446;: (c,h,s) &#x43E;&#x436;&#x438;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; (1023,254,63) &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D;&#x43E; (288,76,44)<br><br>/dev/sda3 &#xA0; &#xA0; 113952+ 115329- &#xA0; 1377- &#xA0;11059200 &#xA0; fd &#xA0;&#x410;&#x432;&#x442;&#x43E;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; Linux raid<br>/dev/sda4 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;0 &#xA0; &#xA0; &#xA0; - &#xA0; &#xA0; &#xA0; 0 &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;0 &#xA0; &#xA0;0 &#xA0;&#x41F;&#x443;&#x441;&#x442;&#x43E;&#x439;<br><br>[root@lanmaster ~]# sfdisk -l /dev/sdc<br>&#x414;&#x438;&#x441;&#x43A; /dev/sdc: 121601 &#x446;&#x438;&#x43B;&#x438;&#x43D;&#x434;&#x440;&#x43E;&#x432;, 255 &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43E;&#x43A;, 63 &#x441;&#x435;&#x43A;&#x442;&#x43E;&#x440;&#x43E;&#x432;/&#x434;&#x43E;&#x440;&#x43E;&#x436;&#x43A;&#x443;</blockquote><p>&#x411;&#x44D;&#x43A;&#x430;&#x43F;&#x438;&#x43C; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x446;&#x44B; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x43E;&#x432; &#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43D;&#x430; sdc &#x442;&#x430;&#x43A;&#x438;&#x435; &#x436;&#x435; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44B;, &#x43A;&#x430;&#x43A; &#x43D;&#x430; sda.<br>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x431;&#x44D;&#x43A;&#x430;&#x43F;:</p><pre><code>sfdisk --dump /dev/sda &gt; /home/alexander/2021-04-29/sda_parttable_mbr.bak</code></pre><p>&#x412;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x431;&#x44D;&#x43A;&#x430;&#x43F; &#x43D;&#x430; &#xA0;/dev/sdc:</p><pre><code>cat /home/alexander/2021-04-29/sda_parttable_mbr.bak | sfdisk /dev/sdc</code></pre><p>&#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44B; &#x43D;&#x430; sdc &#x432; &#x440;&#x44D;&#x439;&#x434; &#x432; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x438;&#x435; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44B; md:</p><pre><code>mdadm /dev/md0 -a /dev/sdc1
mdadm /dev/md1 -a /dev/sdc2
mdadm /dev/md2 -a /dev/sdc3</code></pre><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x434;&#x438;&#x441;&#x43A; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C;&#x44E; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;. &#x421;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E; &#x434;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;, &#x432;&#x432;&#x435;&#x434;&#x44F; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443;: </p><pre><code>cat /proc/mdstat
&#x438;&#x43B;&#x438;
watch -n 2 cat /proc/mdstat</code></pre><p>&#x41D;&#x443;&#x436;&#x43D;&#x43E; &#x435;&#x449;&#x435; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x447;&#x438;&#x43A; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x430; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x434;&#x438;&#x441;&#x43A;, &#x44D;&#x442;&#x43E; &#x443;&#x436;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430;. &#x411;&#x440;&#x430;&#x43B; <a href="https://habr.com/ru/company/otus/blog/486084/">&#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430;</a>:</p><pre><code>grub2-install /dev/sdc</code></pre><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x438; &#x434;&#x438;&#x441;&#x43A;&#x43E;&#x432; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432;&#x430; &#x43C;&#x435;&#x441;&#x442;&#x430;&#x43C;&#x438; - &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x435;&#x442;, &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x430; <code>cat /proc/mdstat</code> &#x43F;&#x43E;&#x43A;&#x430;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x441;&#x441;&#x438;&#x432; &#x432; &#x438;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x438;:</p><pre><code>Personalities : [raid1]
md2 : active raid1 sda3[1] sdc3[0]
      11059136 blocks [2/2] [UU]

md1 : active raid1 sda2[1] sdc2[0]
      914808768 blocks [2/2] [UU]
      bitmap: 2/7 pages [8KB], 65536KB chunk

md0 : active raid1 sda1[1] sdc1[0]
      511936 blocks [2/2] [UU]
</code></pre>]]></content:encoded></item><item><title><![CDATA[Vaadin 14. Модель+контроллер.]]></title><description><![CDATA[<p>&#x415;&#x441;&#x442;&#x44C; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43A;&#x440;&#x443;&#x43F;&#x43D;&#x430;&#x44F; &#x444;&#x43E;&#x440;&#x43C;&#x430;, &#x441;&#x43E; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x441;&#x432;&#x44F;&#x437;</p>]]></description><link>https://lanmaster.su/vaadin-14-modiel-kontrollier/</link><guid isPermaLink="false">606f0df769d546000180497f</guid><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Fri, 09 Apr 2021 08:06:21 GMT</pubDate><content:encoded><![CDATA[<p>&#x415;&#x441;&#x442;&#x44C; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43A;&#x440;&#x443;&#x43F;&#x43D;&#x430;&#x44F; &#x444;&#x43E;&#x440;&#x43C;&#x430;, &#x441;&#x43E; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432;. &#x41F;&#x440;&#x438; &#x432;&#x44B;&#x431;&#x43E;&#x440;&#x435; &#x43A;&#x430;&#x43A;&#x43E;&#x433;&#x43E;-&#x43D;&#x438;&#x431;&#x443;&#x434;&#x44C; &#x43A;&#x43E;&#x43C;&#x431;&#x43E;&#x431;&#x43E;&#x43A;&#x441;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x438;&#x437; &#x411;&#x414; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430;&#x431;&#x43E;&#x440;&#x43E;&#x432; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;, &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x438;&#x445; &#x432; DataProvider-&#x430;&#x445; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432;. &#x412; &#x43E;&#x431;&#x449;&#x435;&#x43C; - &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x430;&#x43F;&#x43E;&#x43C;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x43D;&#x430;&#x442;&#x443; &#x441; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43C; &#x447;&#x438;&#x441;&#x43B;&#x43E;&#x43C; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432; &#x441;&#x43E; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C; &#x43D;&#x438;&#x442;&#x43E;&#x447;&#x435;&#x43A;-&#x441;&#x432;&#x44F;&#x437;&#x435;&#x439;. &#x418; &#x434;&#x435;&#x440;&#x43D;&#x443;&#x432; &#x43E;&#x434;&#x43D;&#x443; &#x43D;&#x438;&#x442;&#x43E;&#x447;&#x43A;&#x443;, &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x448;&#x43A;&#x432;&#x430;&#x43B; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x430;&#x43A;&#x446;&#x438;&#x439; &#x441;&#x43E; &#x432;&#x441;&#x435;&#x445; &#x441;&#x442;&#x43E;&#x440;&#x43E;&#x43D; &#x43A;&#x43E;&#x43C;&#x43D;&#x430;&#x442;&#x44B;. </p><p>&#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x435; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x43E;. &#x41B;&#x44E;&#x431;&#x430;&#x44F; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430; &#x432;&#x43D;&#x435;&#x441;&#x442;&#x438; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43D;&#x44B;&#x43C; &#x431;&#x43E;&#x43B;&#x44F;&#x43C;, &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x43D;&#x430; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43D;&#x435;&#x439; &#x438; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43D;&#x435;&#x439; &#x442;&#x435;&#x441;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;. </p><p>&#x41F;&#x440;&#x438;&#x43D;&#x44F;&#x442;&#x43E; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x443; &#x444;&#x43E;&#x440;&#x43C;&#x44B; &#x43D;&#x430; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x438; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x430;. &#x41C;&#x43D;&#x435; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x432;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; Vaadin &#x432; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x443;&#x44E; &#x441;&#x445;&#x435;&#x43C;&#x443; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; MVC. &#x41F;&#x440;&#x438;&#x434;&#x443;&#x43C;&#x430;&#x43B; &#x43D;&#x435;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x43D;&#x443;&#x44E; <a href="https://asciiflow.com/#/share/eJyrVspLzE1VslLy1Q311HXWDS5NKq4sLknNLVbSUcpJrEwtAspVxyhVxChZWZoa6cQoVQJZRuZmQFZJakUJkBOj9GjKHkykQALAagB%2BFBOTB7Ik1JMs3SSg6S3EM8Ce8fV3cfWBeQviTCiatouS0EHSjWTkJlyhA9KmgMUmUgMAm3Mg5kIZ%2BO2iOKKhrqDARuxBSp5p8CgnzxfE2uns7xcS5O%2Fj4xqEywcK2Mwiy0lUiR%2BISWguwh7sBGMHm1lkomm7qBF%2FmC7CHhsEHYM74JGyFQF7UIINR9qgt1lEepnolIjTjGn4DMDuMPyexqUKn3GuESGuQX6OPgquYa5%2BIcF4jHNxIsI4arqOckSxeTFKtUq1ADUP%2Bwo%3D)">&#x441;&#x432;&#x43E;&#x44E;</a>:</p><figure class="kg-card kg-image-card"><img src="https://lanmaster.su/content/images/2021/04/muic-2.png" class="kg-image" alt loading="lazy" width="786" height="415" srcset="https://lanmaster.su/content/images/size/w600/2021/04/muic-2.png 600w, https://lanmaster.su/content/images/2021/04/muic-2.png 786w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p><strong>Controller:</strong></p>
<ul>
<li>&#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x435;&#x442; &#x432; &#x432;&#x438;&#x434;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x441; &#x43E;&#x434;&#x43D;&#x43E;&#x437;&#x43D;&#x430;&#x447;&#x43D;&#x44B;&#x43C;&#x438; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x44F;&#x43C;&#x438;, &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x44B; &#x43A; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x43F;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430;&#x44E;&#x442; &#x438;&#x437; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x445; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x43E;&#x432;;</li>
<li>&#x434;&#x43B;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; UI, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x434;&#x432;&#x443;&#x445;-&#x44D;&#x442;&#x430;&#x43F;&#x43D;&#x443;&#x44E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44E;:
<ul>
<li>&#x43F;&#x435;&#x440;&#x432;&#x44B;&#x439; &#x44D;&#x442;&#x430;&#x43F; - &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;;</li>
<li>&#x432;&#x442;&#x43E;&#x440;&#x43E;&#x439; &#x44D;&#x442;&#x430;&#x43F; - &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C;&#x44E;;</li>
</ul>
</li>
<li>&#x434;&#x432;&#x443;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43D;&#x43E; &#x432;&#x437;&#x430;&#x438;&#x43C;&#x43E;&#x434;&#x435;&#x439;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; &#x441; UI, &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x43C;&#x438; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430;&#x43C;&#x438;, &#x431;&#x430;&#x437;&#x43E;&#x439; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;;</li>
<li>&#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;;</li>
</ul>
<p><strong>Model:</strong></p>
<ul>
<li>&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x432;&#x441;&#x435;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x444;&#x43E;&#x440;&#x43C;&#x44B;:
<ul>
<li>&#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x431;&#x43E;&#x431;&#x43E;&#x43A;&#x441;&#x43E;&#x432;;</li>
<li>&#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x431;&#x43E;&#x431;&#x43E;&#x43A;&#x441;&#x43E;&#x432; (&#x435;&#x441;&#x43B;&#x438; &#x43D;&#x435; null, &#x442;&#x43E; &#x43E;&#x431;&#x44F;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442; &#x442;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x431;&#x44B;&#x442;&#x44C; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;);</li>
<li>&#x43E;&#x434;&#x438;&#x43D;&#x43E;&#x447;&#x43D;&#x44B;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; Label/Text/Checkbox;</li>
</ul>
</li>
<li>&#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x438;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x434;&#x43B;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44F;&#x445;, &#x43F;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x438;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x447;&#x430;&#x441;&#x442;&#x435;&#x439; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;;</li>
<li>&#x43F;&#x440;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x434;&#x43B;&#x44F; UI &#x438; Controller</li>
<li>&#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x435;&#x442; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x43D;&#x430; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x443; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x439; &#x43E;&#x442; Controller;</li>
</ul>
<p><strong>UI:</strong></p>
<ul>
<li>&#x440;&#x435;&#x430;&#x433;&#x438;&#x440;&#x443;&#x435;&#x442; &#x43D;&#x430; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x44F; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430;, &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x433;&#x443;&#x442; &#x431;&#x44B;&#x442;&#x44C;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, FocusListener, BlurListener &#x438; &#x442;.&#x43F;.;</li>
<li>&#x434;&#x43B;&#x44F; ValueChangeListener &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x443; &#x43D;&#x430; &#x43F;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x44F; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x43E;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; <code>if (event.isFromClient()) {}</code>. &#x415;&#x441;&#x43B;&#x438; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x435; &#x432;&#x435;&#x440;&#x43D;&#x43E; - &#x442;&#x43E; &#x43E;&#x431;&#x44B;&#x447;&#x43D;&#x43E; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x432;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x432;&#x438;&#x434;&#x430; <code>asyncChangeValue*(event.getValue())</code>. &#x41F;&#x440;&#x438;&#x441;&#x442;&#x430;&#x432;&#x43A;&#x430; async* &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43D;&#x430;&#x43F;&#x43E;&#x43C;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x43C;&#x43D;&#x435; &#x43E; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x439;, &#x434;&#x432;&#x443;&#x445;-&#x44D;&#x442;&#x430;&#x43F;&#x43D;&#x44B;&#x439;.</li>
<li>&#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435;&#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x445; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43E;&#x43A; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;&#x445; UI &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43B; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441; <code>ModelSyncable</code>, &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x449;&#x438;&#x439; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x443; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437;&#x43C;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44F;&#x445; &#x438;/&#x438;&#x43B;&#x438; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;. &#x422;&#x438;&#x43F;&#x438;&#x447;&#x43D;&#x430;&#x44F; &#x441;&#x445;&#x435;&#x43C;&#x430; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441; &#x44D;&#x442;&#x438;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x43C;:
<ul>
<li>&#x432;&#x440;&#x430;&#x43F;&#x43F;&#x435;&#x440; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; &#x43D;&#x430;&#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43E;&#x442; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430; <code>ModelSyncable</code> &#x438; &#x43F;&#x435;&#x440;&#x435;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x438;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x438;&#x437; &#x435;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432;:
<ul>
<li><code>syncSupplierModelCollectionIds()</code> - &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; Id &#x43D;&#x430; &#x431;&#x430;&#x437;&#x435; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;;</li>
<li><code>syncSupplierModelValueId()</code> - &#x43C;&#x435;&#x442;&#x43E;&#x434;-&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;;</li>
<li><code>syncSupplierComponentValueId()</code> - &#x43C;&#x435;&#x442;&#x43E;&#x434;-&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;;</li>
<li>&#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44E;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;:
<ul>
<li><code>syncNeedDataProviderRefreshAll()</code> - &#x435;&#x441;&#x43B;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; TRUE, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; DataProvider &#x434;&#x43B;&#x44F; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x439; (refreshAll());</li>
<li><code>syncNeedComponentValueChange()</code> - &#x435;&#x441;&#x43B;&#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442; TRUE, &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;;</li>
</ul>
</li>
<li>&#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; <code>syncByModel()</code>;</li>
</ul>
</li>
</ul>
</li>
</ul>
<!--kg-card-end: markdown--><p>&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;:</p><pre><code class="language-java">@Override
public void syncByModel() {
    if (syncNeedDataProviderRefreshAll())
    	component.getDataProvider().refreshAll();
    if (syncNeedComponentValueChange())
    	component.setValue(lineModel.getEntityAddrss());
}</code></pre><p></p><p>&#x41A;&#x430;&#x440;&#x442;&#x438;&#x43D;&#x43A;&#x430;, &#x43A;&#x430;&#x43A; &#x43E;&#x43D;&#x43E; &#x432;&#x441;&#x435; &#x441;&#x432;&#x44F;&#x437;&#x430;&#x43D;&#x43E; (<a href="https://asciiflow.com/#/share/eJzVVsFO4zAQ%2FRXjUyrRHEBI22q1EgSQkAChlXZPuYRmSiMcG9mm26jqbT9h1f0XtF%2FDl%2BzEKRC3STBtoCIapbaTvPdmPOPplPIoBdqnF90fZ92ASGCK7lIWZSBxdRrSSUj7vd7%2BbkgzHO19OcCRhonGSUhJ3fX4599WLAx5k6baZ8svGpw1%2BF%2BYglHEObBAcC0FYyD9ZibyM2L3QAb42Q3ExMIqFheI3gnXic4WM%2FMMfzsW1lCKlCiQY5C1mzF%2FcI5GTZxzJpXEUBFiM%2BguhJNUxKg0Uhkf1G1KKzFHxoSPxS0QJVKkBT0SsSI571F2kYvwOiuM9W47x8cR7w02f2irIly0vdH1Aq0tgVs02xszM1UYmLQ9T5QGjhXkCc6yoqYGLAGudzqv5oFz%2BjREuxoxGRIPxqjCT9QpagqMJK9TpclV4WDlsLKPnILvBrQJzxPXuh476%2FvgUnnP%2FKp0tG7eanyW9WzEaDcpsoIZiPROcEyWfHQtjsTkq9WuvlVgmsK6luKXeupWm%2Bu021I7mBtFu31rzPuSchdfG9wvL5TR3rVw2rVq9Xh%2Fzlbf%2FoswfT0ulXjF4ZxjXQLEz%2BilnoJH59T3%2Fdk6eMeRjq6kGGNqy%2B8wlKBGhwzl2oCPf38vub%2BKW6J3vj7v9od0Rmf%2FAbFJ5Vs%3D)">link</a>):</p><figure class="kg-card kg-image-card"><img src="https://lanmaster.su/content/images/2021/04/muic-relations.png" class="kg-image" alt loading="lazy" width="702" height="556" srcset="https://lanmaster.su/content/images/size/w600/2021/04/muic-relations.png 600w, https://lanmaster.su/content/images/2021/04/muic-relations.png 702w"></figure><p><strong>&#x412;&#x440;&#x430;&#x43F;&#x43F;&#x435;&#x440; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; </strong>- &#x44D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441;, &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;&#x435; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;, &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x435;&#x433;&#x43E; &#x43B;&#x438;&#x441;&#x442;&#x435;&#x43D;&#x435;&#x440;&#x43E;&#x432; &#x438; &#x442;.&#x434;. &#x413;&#x435;&#x442;&#x442;&#x435;&#x440; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; getComponent() &#x43F;&#x440;&#x438;&#x43B;&#x430;&#x433;&#x430;&#x435;&#x442;&#x441;&#x44F;.</p><p><strong>&#x410;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x439; &#x434;&#x432;&#x443;&#x445;-&#x44D;&#x442;&#x430;&#x43F;&#x43D;&#x44B;&#x439; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x41A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x430;</strong> - &#x44D;&#x442;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x44E;&#x449;&#x438;&#x439; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x442;&#x44F;&#x436;&#x435;&#x43B;&#x44B;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432; &#x43E;&#x442;&#x440;&#x44B;&#x432;&#x435; &#x43E;&#x442; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x433;&#x43E; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;&#x430; UI. &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x432; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x43C; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;&#x435; UI - &#x44D;&#x442;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x43A; &#x442;&#x43E;&#x440;&#x43C;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44E; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x435; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x43E; (&#x43E;&#x442;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x43E;&#x442; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;&#x430;) &#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x434;&#x432;&#x430; &#x431;&#x43B;&#x43E;&#x43A;&#x430; &#x43A;&#x43E;&#x434;&#x430;:</p><ul><li>&#x442;&#x44F;&#x436;&#x435;&#x43B;&#x44B;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x438;&#x44E; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x411;&#x414;, &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;;</li><li>&#x432;&#x44B;&#x437;&#x43E;&#x432; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; `syncByModel()`, &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x431;&#x44B;&#x43B;&#x438; &#x437;&#x430;&#x442;&#x440;&#x43E;&#x43D;&#x443;&#x442;&#x44B; &#x432; &#x43F;&#x435;&#x440;&#x432;&#x43E;&#x43C; &#x431;&#x43B;&#x43E;&#x43A;&#x435;. &#x42D;&#x442;&#x43E;&#x442; &#x431;&#x43B;&#x43E;&#x43A; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x440;&#x438; &#x431;&#x43B;&#x43E;&#x43A;&#x438;&#x440;&#x43E;&#x432;&#x43A;&#x435; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;&#x430; UI, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; <code>ui.access()</code>;</li></ul><h2 id="%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B-%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%D1%83-%D1%81%D0%B5%D0%B1%D0%B5">&#x421;&#x43E;&#x432;&#x435;&#x442;&#x44B; &#x441;&#x430;&#x43C;&#x43E;&#x43C;&#x443; &#x441;&#x435;&#x431;&#x435;:</h2><ul><li>&#x43D;&#x435; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x44B; <strong>&#x434;&#x43B;&#x44F; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445;</strong> &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432;, &#x43F;&#x443;&#x441;&#x43A;&#x430;&#x439; &#x43E;&#x43D; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x434;&#x438;&#x43D; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x439; (&#x443; &#x43C;&#x435;&#x43D;&#x44F; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x435;&#x435; 700 &#x441;&#x442;&#x440;&#x43E;&#x43A;), &#x43D;&#x43E; &#x432;&#x441;&#x435; &#x432; &#x43E;&#x434;&#x43D;&#x43E;&#x43C; &#x43C;&#x435;&#x441;&#x442;&#x435;. &#x413;&#x43E;&#x440;&#x430;&#x437;&#x434;&#x43E; &#x441;&#x43B;&#x43E;&#x436;&#x43D;&#x435;&#x435; &#x43A;&#x43E;&#x434;&#x438;&#x442;&#x44C;, &#x438;&#x43C;&#x435;&#x44F; &#x434;&#x432;&#x430; &#x438; &#x431;&#x43E;&#x43B;&#x435;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x437;&#x430;&#x432;&#x438;&#x441;&#x44F;&#x442; &#x434;&#x440;&#x443;&#x433; &#x43E;&#x442; &#x434;&#x440;&#x443;&#x433;&#x430;. &#x423; &#x43C;&#x435;&#x43D;&#x44F; &#x432; &#x444;&#x43E;&#x440;&#x43C;&#x435; &#x435;&#x441;&#x442;&#x44C; &#x433;&#x440;&#x438;&#x434;, &#x43A;&#x430;&#x436;&#x434;&#x430;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x438;&#x442; &#x438;&#x437; 3 ComboBox &#x438; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; Div. &#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x44F; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43B; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440; &#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x434;&#x43B;&#x44F; &#x433;&#x440;&#x438;&#x434;&#x430;, &#x43F;&#x43E;&#x442;&#x43E;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440; &#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x434;&#x43B;&#x44F; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x433;&#x440;&#x438;&#x434;&#x430;. &#x41A;&#x43E;&#x433;&#x434;&#x430; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E; &#x441;&#x43C;&#x435;&#x448;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x438; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x44B; &#x438;&#x437; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x43E;&#x432; &#x432;&#x43E; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x44B; &#x438; &#x43D;&#x430;&#x43E;&#x431;&#x43E;&#x440;&#x43E;&#x442; - &#x43D;&#x430;&#x441;&#x442;&#x430;&#x43B; &#x43A;&#x43E;&#x448;&#x43C;&#x430;&#x440;. &#x41F;&#x440;&#x438;&#x448;&#x43B;&#x43E;&#x441;&#x44C; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x44B; &#x432; &#x43E;&#x434;&#x438;&#x43D; - GridController. &#x410; &#x432;&#x43E;&#x442; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x44F; &#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x43B; &#x43A;&#x430;&#x43A; &#x431;&#x44B;&#x43B;&#x43E; - &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x433;&#x440;&#x438;&#x434;&#x430; &#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438;.</li><li>&#x434;&#x43B;&#x44F; <strong>&#x43D;&#x435; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445;</strong> &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43A;&#x43E;&#x43D;&#x442;&#x440;&#x43E;&#x43B;&#x43B;&#x435;&#x440;&#x44B; &#x432;&#x43F;&#x43E;&#x43B;&#x43D;&#x435; &#x440;&#x430;&#x437;&#x443;&#x43C;&#x43D;&#x43E;, &#x43E;&#x441;&#x43E;&#x431;&#x435;&#x43D;&#x43D;&#x43E; &#x435;&#x441;&#x43B;&#x438; &#x432; &#x43D;&#x438;&#x445; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;;</li><li>&#x434;&#x432;&#x443;&#x445;-&#x44D;&#x442;&#x430;&#x43F;&#x43D;&#x44B;&#x435; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x43F;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x43D;&#x435; &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x44B; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x44C; &#x432; &#x441;&#x435;&#x431;&#x44F; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x44B; &#x434;&#x440;&#x443;&#x433;&#x438;&#x445; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x442;&#x430;&#x43A;&#x43E;&#x433;&#x43E; &#x436;&#x435; &#x442;&#x438;&#x43F;&#x430;. &#x418;&#x43D;&#x430;&#x447;&#x435; &#x43D;&#x430;&#x447;&#x43D;&#x435;&#x442;&#x441;&#x44F; &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x442;&#x438;&#x43F;&#x430; &apos;race condition&apos; &#x438; &#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; &#x43D;&#x435;&#x44F;&#x441;&#x435;&#x43D; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442; &#x432;&#x441;&#x435;&#x439; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438;. &#x41F;&#x43E;&#x434;&#x43E;&#x431;&#x43D;&#x44B;&#x435; &#x430;&#x441;&#x438;&#x43D;&#x445;&#x440;&#x43E;&#x43D;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x43D;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x435;&#x43A;&#x430;&#x44E;&#x449;&#x438;&#x445;&#x441;&#x44F; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x439;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432;&#x44B;&#x432;&#x43E;&#x434; &#x443;&#x432;&#x435;&#x434;&#x43E;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x44F;.</li></ul><h2 id="%D0%BA%D0%BE%D0%B5-%D0%BA%D0%B0%D0%BA%D0%BE%D0%B9-%D0%BA%D0%BE%D0%B4">&#x41A;&#x43E;&#x435;-&#x43A;&#x430;&#x43A;&#x43E;&#x439; &#x43A;&#x43E;&#x434;:</h2><pre><code class="language-Java">import com.vaadin.flow.component.Component;
import ru.waptaxi.wtwebordermanager.jettyserv.webcontext.views.reception.model.ReceptionModel;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * &#x410;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x44B;&#x439; &#x43A;&#x43B;&#x430;&#x441;&#x441; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x440;&#x430;&#x43F;&#x43F;&#x435;&#x440;&#x430;&#x43C;&#x438; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432;.
 * &#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x43E;&#x435; &#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; - &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x438; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;.
 *
 * @since 2021-04-05
 */
public abstract class ModelSyncable {

    private static final String METHOD_NOT_IMPLEMENTED_STRING = &quot;&#x41D;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434; &apos;%s&apos; &#x432; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435; %s&quot;;
    private static final String METHOD_NOT_FOUND_STRING = &quot;&#x41E;&#x448;&#x438;&#x431;&#x43A;&#x430; &#x43E;&#x431;&#x43D;&#x430;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &apos;%s&apos; &#x432; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435; %s&quot;;

    protected ModelSyncable() {
    }


    /*
     * ***************************************************************************************
     * ***************************************************************************************
     * *********************** &#x421;&#x418;&#x41D;&#x425;&#x420;&#x41E;&#x41D;&#x418;&#x417;&#x410;&#x426;&#x418;&#x42F; &#x414;&#x410;&#x41D;&#x41D;&#x42B;&#x425; &#x41A;&#x41E;&#x41C;&#x41F;&#x41E;&#x41D;&#x415;&#x41D;&#x422;&#x410; &#x418; &#x41C;&#x41E;&#x414;&#x415;&#x41B;&#x418; **********************
     * ***************************************************************************************
     * ***************************************************************************************
     * 2021-03-15. &#x412;&#x441;&#x44F; &#x44D;&#x442;&#x430; &#x43A;&#x430;&#x448;&#x430; &#x437;&#x430;&#x432;&#x430;&#x440;&#x435;&#x43D;&#x430; &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x435;&#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x445; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x447; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43C;&#x435;&#x436;&#x434;&#x443;
     * &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x43E;&#x43C; &#x438; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x43E;&#x43C;. &#x41C;&#x435;&#x442;&#x43E;&#x434;&#x44B; syncNeed*, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A;&#x43E;&#x432; syncSupplier*,
     * &#x432;&#x43E;&#x437;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x442; &#x43F;&#x440;&#x438;&#x437;&#x43D;&#x430;&#x43A;&#x438;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43B;&#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     * (&#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x441; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x44F;&#x43C;&#x438;) &#x438; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43B;&#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;
     * &#x43D;&#x430; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;.
     */

    /**
     * &#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     */
    public abstract void syncByModel();


    /**
     * ***************************************************************************************
     * &#x414;&#x435;&#x442;&#x435;&#x43A;&#x446;&#x438;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x43E;&#x439; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;
     * ***************************************************************************************
     */
    private static final String SYNC_SUPPLIER_MODEL_COLLECTION_IDS_METHOD = findMethodNameForAnnotation(SyncSupplierModelCollectionIdsMethod.class);
    private int collectionIdsHash = 0; // &#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x439; &#x445;&#x44D;&#x448; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;


    /**
     * &#x414;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x44B;&#x439; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x430; Integer &#x438;&#x437; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x445;&#x44D;&#x448;&#x430;
     * &#x414;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x43E;&#x432; Vaadin, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x43C; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x43E;&#x431; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F;&#x445; &#x432; &#x438;&#x445; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;,
     * &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x44F;&#x442;&#x44C; &#x44D;&#x442;&#x43E;&#x442; &#x43C;&#x435;&#x442;&#x43E;&#x434;, &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x443;&#x44F; &#x432; &#x43D;&#x435;&#x43C; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x438;&#x43F;&#x430; List&lt;Integer&gt;,
     * &#x441;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x449;&#x438;&#x445; &#x438;&#x437; ID &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;. &#x411;&#x435;&#x437; &#x43F;&#x435;&#x440;&#x435;&#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x434;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x44B;&#x439; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A;
     * &#x431;&#x443;&#x434;&#x435;&#x442; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x432;&#x44B;&#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x443;&#x441;&#x442;&#x43E;&#x439; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x438; &#x445;&#x44D;&#x448; &#x441;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442;.
     *
     * @return &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; List&lt;Integer&gt; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x441;&#x447;&#x435;&#x442;&#x430; &#x445;&#x44D;&#x448;&#x430;
     */
    @SyncSupplierModelCollectionIdsMethod
    public Supplier&lt;List&lt;Integer&gt;&gt; syncSupplierModelCollectionIds() {
        return ArrayList::new;
    }


    /**
     * &#x41F;&#x440;&#x438;&#x437;&#x43D;&#x430;&#x43A; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;
     * &#x417;&#x434;&#x435;&#x441;&#x44C; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;&#x441;&#x44F;, &#x433;&#x434;&#x435; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434;-&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; List&lt;Integer&gt;.
     * &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x434;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x43E;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435; - &#x442;&#x43E; &#x43D;&#x438;&#x43A;&#x430;&#x43A;&#x438;&#x435;
     * &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x435;&#x442;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442;.
     */
    public final boolean syncNeedDataProviderRefreshAll() {
        // &#x414;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; (&#x418;&#x43C;&#x44F; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;) - &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x440;&#x435;&#x430;&#x43A;&#x446;&#x438;&#x438; &quot;&#x43D;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434;&quot;,
        // &#x442;.&#x43A;. &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x443;&#x441;&#x442;&#x43E;&#x439;, &#x447;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x442; &#x43A; &#x43B;&#x43E;&#x436;&#x43D;&#x43E;&#x43C;&#x443; &#x441;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x43D;&#x438;&#x44E; &#x43B;&#x43E;&#x433;&#x438;&#x43A;&#x438;
        String collectionHashSupplierDeclaringClassName;
        try {
            collectionHashSupplierDeclaringClassName = this.getClass().getMethod(SYNC_SUPPLIER_MODEL_COLLECTION_IDS_METHOD)
                    .getDeclaringClass().getSimpleName().intern();
        } catch (NoSuchMethodException e) {
            OperationsLogger.logError(e, String.format(METHOD_NOT_FOUND_STRING, SYNC_SUPPLIER_MODEL_COLLECTION_IDS_METHOD, this.getClass().getSimpleName()));
            return false;
        }

        String abstractClassName = ModelSyncable.class.getSimpleName().intern();
        // &#x415;&#x441;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;-&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x445;&#x44D;&#x448;&#x430; &#x43D;&#x435; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x432; &#x434;&#x43E;&#x447;&#x435;&#x440;&#x43D;&#x435;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435;, &#x442;&#x43E; &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433; &#x438; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x430;&#x449;&#x430;&#x435;&#x43C; false,
        // &#x438;&#x43D;&#x430;&#x447;&#x435; - &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x430;&#x43A;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x445;&#x44D;&#x448; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438; &#x438; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x441; &#x440;&#x430;&#x43D;&#x435;&#x435; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;
        if (collectionHashSupplierDeclaringClassName.equals(abstractClassName)) {
            OperationsLogger.logWarn(String.format(METHOD_NOT_IMPLEMENTED_STRING, SYNC_SUPPLIER_MODEL_COLLECTION_IDS_METHOD, this.getClass().getSimpleName()));
        } else {
            List&lt;Integer&gt; ids = syncSupplierModelCollectionIds().get();
            int actualCollectionHash = Objects.hash(ids.toArray()); // &#x425;&#x44D;&#x448; &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; ID &#x44D;&#x43B;&#x435;&#x43C;&#x435;&#x43D;&#x442;&#x43E;&#x432; &#x43A;&#x43E;&#x43B;&#x43B;&#x435;&#x43A;&#x446;&#x438;&#x438;
            if (actualCollectionHash != collectionIdsHash) {
                collectionIdsHash = actualCollectionHash;
                return true;
            }
        }
        return false;
    }


    /*
     * ***************************************************************************************
     * &#x414;&#x435;&#x442;&#x435;&#x43A;&#x446;&#x438;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x43E;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x438;, &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C;&#x43E;&#x43C; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;
     * &#x421;&#x440;&#x430;&#x432;&#x43D;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435; &#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     *
     * @see #syncSupplierComponentValueId - &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;
     * @see #syncSupplierModelValueId()     - &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     * ***************************************************************************************
     */

    private static final String SYNC_SUPPLIER_MODEL_VALUE_ID_METHOD = findMethodNameForAnnotation(SyncSupplierModelValueIdMethod.class);
    private static final String SYNC_SUPPLIER_COMPONENT_VALUE_ID_METHOD = findMethodNameForAnnotation(SyncSupplierComponentValueIdMethod.class);


    /**
     * &#x41F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; ID &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; ID
     * &#x41D;&#x443;&#x436;&#x435;&#x43D; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43B;&#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;...
     * &#x415;&#x441;&#x43B;&#x438; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     * - &#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;
     *
     * @see #syncSupplierComponentValueId()
     */
    @SyncSupplierModelValueIdMethod
    public Supplier&lt;Object&gt; syncSupplierModelValueId() {
        return () -&gt; 0;
    }


    /**
     * &#x41F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x449;&#x438;&#x43A; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; ID
     * &#x41D;&#x443;&#x436;&#x435;&#x43D; &#x434;&#x43B;&#x44F; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43B;&#x438; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;...
     * &#x415;&#x441;&#x43B;&#x438; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x442;&#x435;&#x43A;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     * - &#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435;
     *
     * @see #syncSupplierModelValueId()
     */
    @SyncSupplierComponentValueIdMethod
    public Supplier&lt;Object&gt; syncSupplierComponentValueId() {
        return () -&gt; 0;
    }


    /**
     * &#x41C;&#x435;&#x442;&#x43E;&#x434;, &#x432;&#x43E;&#x437;&#x440;&#x430;&#x449;&#x430;&#x44E;&#x449;&#x438;&#x439; TRUE, &#x435;&#x441;&#x43B;&#x438; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x435; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438;
     */
    public final boolean syncNeedComponentValueChange() {
        // &#x418;&#x43C;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C;
        String methodImplementsClassName1;
        try {
            methodImplementsClassName1 = this.getClass().getMethod(SYNC_SUPPLIER_MODEL_VALUE_ID_METHOD).getDeclaringClass().getSimpleName().intern();
        } catch (NoSuchMethodException e) {
            OperationsLogger.logError(e, String.format(METHOD_NOT_FOUND_STRING, SYNC_SUPPLIER_MODEL_VALUE_ID_METHOD, this.getClass().getSimpleName()));
            return false;
        }

        // &#x418;&#x43C;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x430;, &#x432; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x441; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x438;&#x43C;&#x435;&#x43D;&#x435;&#x43C;
        String methodImplementsClassName2;
        try {
            methodImplementsClassName2 = this.getClass().getMethod(SYNC_SUPPLIER_COMPONENT_VALUE_ID_METHOD).getDeclaringClass().getSimpleName().intern();
        } catch (NoSuchMethodException e) {
            OperationsLogger.logError(e, String.format(METHOD_NOT_FOUND_STRING, SYNC_SUPPLIER_COMPONENT_VALUE_ID_METHOD, this.getClass().getSimpleName()));
            return false;
        }

        String abstractClassName = ModelSyncable.class.getSimpleName().intern();
        // &#x415;&#x441;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;1 &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x43E;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435;, &#x442;&#x43E; &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433;
        // &#x438;&#x43D;&#x430;&#x447;&#x435;, &#x435;&#x441;&#x43B;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;2 &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x432; &#x430;&#x431;&#x441;&#x442;&#x440;&#x430;&#x43A;&#x442;&#x43D;&#x43E;&#x43C; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x435;, &#x442;&#x43E; &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433;
        // &#x438;&#x43D;&#x430;&#x447;&#x435; - &#x441;&#x447;&#x438;&#x442;&#x430;&#x435;&#x43C; &#x445;&#x44D;&#x448; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x438; &#x438; &#x441;&#x440;&#x430;&#x432;&#x43D;&#x438;&#x432;&#x430;&#x435;&#x43C; &#x435;&#x433;&#x43E; &#x441; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x43D;&#x44B;&#x43C; &#x434;&#x43B;&#x44F; &#x43A;&#x43E;&#x43C;&#x43F;&#x43E;&#x43D;&#x435;&#x43D;&#x442;&#x430;
        if (methodImplementsClassName1.equals(abstractClassName)) {
            OperationsLogger.logWarn(String.format(METHOD_NOT_IMPLEMENTED_STRING, SYNC_SUPPLIER_MODEL_VALUE_ID_METHOD, this.getClass().getSimpleName()));
        } else if (methodImplementsClassName2.equals(abstractClassName)) {
            OperationsLogger.logWarn(String.format(METHOD_NOT_IMPLEMENTED_STRING, SYNC_SUPPLIER_COMPONENT_VALUE_ID_METHOD, this.getClass().getSimpleName()));
        } else {
            int modelValueHash = Objects.hash(syncSupplierModelValueId().get());
            int componentValueHash = Objects.hash(syncSupplierComponentValueId().get());
            if (modelValueHash != componentValueHash)
                return true;
        }
        return false;
    }


    /**
     * &#x41F;&#x43E;&#x438;&#x441;&#x43A; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x43F;&#x43E; &#x430;&#x43D;&#x43D;&#x43E;&#x442;&#x430;&#x446;&#x438;&#x438;
     */
    private static String findMethodNameForAnnotation(Class&lt;? extends Annotation&gt; annotationName) {
        Method[] methods = ModelSyncable.class.getMethods();
        for (Method method : methods) {
            boolean annotationPresent = method.isAnnotationPresent(annotationName);
            if (annotationPresent)
                return method.getName();
        }
        return &quot;&quot;;
    }


}



</code></pre><pre><code class="language-Java">@Retention(RetentionPolicy.RUNTIME)
public @interface SyncSupplierComponentValueIdMethod {
}</code></pre><pre><code class="language-Java">@Retention(RetentionPolicy.RUNTIME)
public @interface SyncSupplierModelCollectionIdsMethod {
}</code></pre><pre><code class="language-Java">@Retention(RetentionPolicy.RUNTIME)
public @interface SyncSupplierModelValueIdMethod {
}
</code></pre><pre><code class="language-Java">public class CityComboBox2 extends ModelSyncable {

    private final MarshrutGridRow marshrutGridRow;
    private final ComboBox&lt;EntityCity&gt; component;
    private final MarshrutGrid2 marshrutGrid2;
    private final MarshrutGridRowModel rowModel;


    /**
     * &#x41A;&#x43E;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x43E;&#x440;
     */
    public CityComboBox2(MarshrutGridRow marshrutGridRow) {
        this.marshrutGridRow = marshrutGridRow;
        this.marshrutGrid2 = marshrutGridRow.getMarshrutGrid();
        this.rowModel = marshrutGridRow.getRowModel();

        component = new ComboBox&lt;&gt;();
        component.setSizeFull();

        // &#x41F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x438; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x43D;&#x430;&#x431;&#x43E;&#x440;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;
        component.setItemLabelGenerator(EntityCity::getName);
        ListDataProvider&lt;EntityCity&gt; dataProvider = new ListDataProvider&lt;&gt;(rowModel.getEntityCityList());
        dataProvider.setSortOrder(EntityCity::getName, SortDirection.ASCENDING);
        component.setDataProvider(dataProvider);

        component.addValueChangeListener(event -&gt; {
            if (event.isFromClient()) marshrutGrid2.getController().asyncChangeCity(marshrutGridRow, event.getValue());
        });

        component.addFocusListener(event -&gt; marshrutGrid2.getController().focusSetLast(component));

    }


    public ComboBox&lt;EntityCity&gt; getComponent() {
        return component;
    }


    @Override
    public Supplier&lt;List&lt;Integer&gt;&gt; syncSupplierModelCollectionIds() {
        return () -&gt; rowModel.getEntityCityList().stream().map(EntityCity::getCityId).collect(Collectors.toList());
    }

    @Override
    public Supplier&lt;Object&gt; syncSupplierModelValueId() {
        return rowModel::getCityId;
    }

    @Override
    public Supplier&lt;Object&gt; syncSupplierComponentValueId() {
        return () -&gt; Objects.nonNull(component.getValue()) ? component.getValue().getCityId() : 0;
    }

    @Override
    public void syncByModel() {
        if (syncNeedDataProviderRefreshAll())
            component.getDataProvider().refreshAll();
        if (syncNeedComponentValueChange())
            component.setValue(rowModel.getEntityCity());

    }
}
</code></pre>]]></content:encoded></item><item><title><![CDATA[Удаление клонов stackoverflow в выдаче Гугла (периодически обновляется)]]></title><description><![CDATA[<p>&#x421;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x430;&#x434;&#x43E;&#x435;&#x43B;&#x430; &#x43A;&#x443;&#x447;&#x430; &#x445;&#x43B;&#x430;&#x43C;&#x430; &#x441; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x438;&#x437; stackoverflow &#x432; &#x432;&#x44B;&#x434;&#x430;&#x447;&#x435; &#x43F;&#x43E;</p>]]></description><link>https://lanmaster.su/udalieniie-klonov-stackoverflow-v-vydachie-gughla/</link><guid isPermaLink="false">5e576e397824a90001b8cf22</guid><category><![CDATA[google]]></category><category><![CDATA[stackoverflow]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Thu, 27 Feb 2020 07:25:13 GMT</pubDate><content:encoded><![CDATA[<p>&#x421;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x430;&#x434;&#x43E;&#x435;&#x43B;&#x430; &#x43A;&#x443;&#x447;&#x430; &#x445;&#x43B;&#x430;&#x43C;&#x430; &#x441; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x43E;&#x434;&#x43E;&#x43C; &#x441;&#x442;&#x430;&#x442;&#x435;&#x439; &#x438;&#x437; stackoverflow &#x432; &#x432;&#x44B;&#x434;&#x430;&#x447;&#x435; &#x43F;&#x43E;&#x438;&#x441;&#x43A;&#x43E;&#x432;&#x438;&#x43A;&#x430; google.com. &#x413;&#x434;&#x435;-&#x442;&#x43E; &#x432; &#x438;&#x43D;&#x435;&#x442;&#x435; &#x43D;&#x430;&#x43A;&#x43E;&#x43F;&#x430;&#x43B; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;, &#x434;&#x430; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x438;&#x442; &#x43C;&#x435;&#x43D;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x440; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x430;, &#x43D;&#x435; &#x43C;&#x43E;&#x433;&#x443; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43D;&#x438;&#x442;&#x44C; - &#x433;&#x434;&#x435; &#x438;&#x43C;&#x435;&#x43D;&#x43D;&#x43E; &#x43D;&#x430;&#x448;&#x435;&#x43B;.</p><p>&#x421;&#x442;&#x430;&#x432;&#x438;&#x43C; &#x432; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x435; - &#x431;&#x43B;&#x43E;&#x43A;&#x438;&#x440;&#x43E;&#x432;&#x449;&#x438;&#x43A; &#x440;&#x435;&#x43A;&#x43B;&#x430;&#x43C;&#x44B;: <a href="https://adblockplus.org/" rel="nofollow noopener">AdBlock Plus</a></p><p>&#x41F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x432; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; AdBlock, &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B; &#xAB;&#x420;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x43D;&#x44B;&#x435;&#xBB; &#x2192; &#xAB;&#x41C;&#x43E;&#x439; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#xA0;&#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#xBB;. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x442;&#x443;&#x434;&#x430; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A;, &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43D;&#x438;&#x436;&#x435;. &#x412;&#x440;&#x43E;&#x434;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#xA0;&#x432;&#x441;&#x435; &#x441;&#x440;&#x430;&#x437;&#x443;. &#x421;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x43F;&#x43B;&#x43E;&#x445;&#x438;&#x445; &#x434;&#x43E;&#x43C;&#x435;&#x43D;&#x43E;&#x432;, &#x434;&#x43B;&#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x431;&#x43B;&#x43E;&#x43A;&#x438;&#x440;&#x43E;&#x432;&#x43A;&#x438; &#xA0;AdBlock:</p><pre><code>google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;codeflow.site&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;qaru.site&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;coredump.su&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;askdev.info&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;ubuntugeeks.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;programmerz.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;code-examples.net&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;stackovernet.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;stackoverrun.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;qa-help.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;switch-case.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;switch-case.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;answer-id.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;codeday.me&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;issue.life&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;stackru.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;voidcc.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;overcoder.net&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;askvoprosy.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;progi.pro&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;vike.io&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;codengineering.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;it-swarm.net&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;qarus.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;programqa.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;likeflow.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;stackanswers.net&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;i-harness.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;askdev.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;fooobar.com&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;coderquestion.ru&quot;])
google.com,google.ru#?##search .srg&gt; .g:-abp-has(a[href*=&quot;myht.ru&quot;])</code></pre>]]></content:encoded></item><item><title><![CDATA[Установка Nominatim в Docker]]></title><description><![CDATA[<h2 id="-">&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x439; &#x441; &#x433;&#x438;&#x442;&#x445;&#x430;&#x431;&#x430;</h2><pre><code>mkdir /home/user/nominatim
cd /home/user/nominatim
git clone https://github.com/merlinnot/nominatim-docker.git
cd /home/user/nominatim/nominatim-docker</code></pre><p>&#x421;&#x43E;&#x431;&#x438;</p>]]></description><link>https://lanmaster.su/ustanovka-nominatim-v-docker/</link><guid isPermaLink="false">5e5765b57824a90001b8cef1</guid><category><![CDATA[Openstreetmap]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Nominatim]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Thu, 27 Feb 2020 06:48:52 GMT</pubDate><content:encoded><![CDATA[<h2 id="-">&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x439; &#x441; &#x433;&#x438;&#x442;&#x445;&#x430;&#x431;&#x430;</h2><pre><code>mkdir /home/user/nominatim
cd /home/user/nominatim
git clone https://github.com/merlinnot/nominatim-docker.git
cd /home/user/nominatim/nominatim-docker</code></pre><p>&#x421;&#x43E;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; Docker. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43F;&#x43E;&#x44F;&#x441;&#x43D;&#x438;&#x442;&#x44C;: &#x43F;&#x435;&#x440;&#x432;&#x44B;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x435;&#x43D;&#x44B; &#x432; &#xA0;&#x43F;&#x435;&#x440;&#x432;&#x43E;&#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x435;, &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x435; &#x434;&#x432;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; - &#x44D;&#x442;&#x43E; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x438;&#x435;, &#x43E;&#x442;&#x43A;&#x443;&#x434;&#x430; &#xA0;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x438;&#x441;&#x445;&#x43E;&#x434;&#x43D;&#x44B;&#x439; &#x434;&#x430;&#x43C;&#x43F; OSM &#x438; &#x43E;&#x442;&#x43A;&#x443;&#x434;&#x430; &#x431;&#x440;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43A; &#x43D;&#x435;&#x43C;&#x443;. &#x41E;&#x447;&#x435;&#x43D;&#x44C; &#xA0;&#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x44E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; SSD-&#x434;&#x438;&#x441;&#x43A;, &#x43F;&#x440;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x435; &#x441; &#x431;&#x430;&#x437;&#x43E;&#x439; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x44D;&#x442;&#x43E; &#x441;&#x442;&#x430;&#x43D;&#x435;&#x442; &#xA0;&#x443;&#x437;&#x43A;&#x438;&#x43C; &#x43C;&#x435;&#x441;&#x442;&#x43E;&#x43C; &#x432;&#x441;&#x435;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;.</p><pre><code>docker build . \
-t nominatim \
--build-arg PGSQL_VERSION=10 \
--build-arg POSTGIS_VERSION=2.5 \
--build-arg BUILD_THREADS=2 \
--build-arg BUILD_MEMORY=1GB \
--build-arg OSM2PGSQL_CACHE=1000 \
--build-arg RUNTIME_THREADS=4 \
--build-arg RUNTIME_MEMORY=2GB \
--build-arg PBF_URL=https://download.geofabrik.de/russia/ural-fed-district-latest.osm.pbf \
--build-arg REPLICATION_URL=https://download.geofabrik.de/russia/ural-fed-district-updates</code></pre><!--kg-card-begin: markdown--><p>&#x414;&#x43E;&#x43B;&#x433;&#x43E;-&#x434;&#x43E;&#x43B;&#x433;&#x43E; &#x436;&#x434;&#x435;&#x43C;&#x2026; &#x411;&#x44B;&#x43B;&#x43E; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x43D;&#x43E; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43F;&#x43E;&#x43F;&#x44B;&#x442;&#x43E;&#x43A; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x430;:</p>
<ol>
<li>&#x423;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x448;&#x43B;&#x430; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x430; &#x434;&#x43B;&#x44F; &#x423;&#x440;&#x430;&#x43B;&#x430;.  &#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x434;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x43D;&#x430; &#x432;&#x438;&#x440;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x435; Virtualbox &#x441; &#x433;&#x43E;&#x441;&#x442;&#x435;&#x432;&#x43E;&#x439;  &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x43E;&#x439; CentOS 7 (1511) &#x441; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x439; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x44C;&#x44E; 2Gb. &#x420;&#x430;&#x437;&#x43C;&#x435;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x430; &#x434;&#x43B;&#x44F;  &#x423;&#x440;&#x430;&#x43B;&#x430; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x43B;&#x441;&#x44F; &#x43E;&#x43A;&#x43E;&#x43B;&#x43E; 10 Gb.</li>
<li>&#x41F;&#x43E;&#x43F;&#x44B;&#x442;&#x43A;&#x430; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x430;  &#x434;&#x43B;&#x44F; &#x420;&#x43E;&#x441;&#x441;&#x438;&#x438; &#x43D;&#x430; &#x436;&#x438;&#x432;&#x43E;&#x439; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x435; (CentOS 7 (1511), 2Gb &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x438; 500Gb &#x43C;&#x435;&#x441;&#x442;&#x430; &#x43D;&#x430;  &#x434;&#x438;&#x441;&#x43A;&#x435;, &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D; docker-ce) &#x43F;&#x440;&#x43E;&#x432;&#x430;&#x43B;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x441; &#x442;&#x430;&#x43A;&#x43E;&#x439; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x43E;&#x439;:</li>
</ol>
<blockquote>
<p>Reading in file: /srv/nominatim/src/data.osm.pbf<br>
Using PBF parser.<br>
Processing: Node(322360k 329.3k/s) Way(0k 0.00k/s) Relation(0  0.00/s)COPY_END for planet_osm_nodes failed: ERROR: could not extend  file &#xAB;base/16386/19754.1&#xBB;: wrote only 4096 of 8192 bytes at block 208840<br>
HINT: Check free disk space. CONTEXT: COPY planet_osm_nodes, line 38636000<br>
(&#x412;&#x435;&#x440;&#x43E;&#x44F;&#x442;&#x43D;&#x43E;, &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x439; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x434;&#x43B;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x43E;&#x433;&#x43E; &#x434;&#x430;&#x43C;&#x43F;&#x430; &#x420;&#x43E;&#x441;&#x441;&#x438;&#x438;.)</p>
</blockquote>
<p>&#x412; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x430; Docker &#x431;&#x443;&#x434;&#x435;&#x442; &#x437;&#x430;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x43E;&#x43A;&#x43E;&#x43B;&#x43E;  100 Gb.</p>
<!--kg-card-end: markdown--><h2 id="--1">&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; &#x441; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x43C;&#x438;</h2><p>&#x41A;&#x43B;&#x44E;&#x447; -h &#x43D;&#x443;&#x436;&#x435;&#x43D;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x442;&#x44C; &#x432; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; &#x438;&#x43C;&#x44F; &#x445;&#x43E;&#x441;&#x442;&#x430;, &#x43E;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x43E;&#x434;&#x441;&#x442;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x432;&#x43E; &#x432;&#x441;&#x435; URL, &#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x434;&#x43B;&#x44F; &#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; Nominatim. &#x415;&#x441;&#x43B;&#x438; &#x435;&#x433;&#x43E; &#x43D;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; - &#x442;&#x43E; URL &#x431;&#x443;&#x434;&#x443;&#x442; &#x444;&#x43E;&#x440;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x441; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x435;&#x433;&#x43E; &#x438;&#x43C;&#x435;&#x43D;&#x438; &#x445;&#x43E;&#x441;&#x442;&#x430; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; &#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x430; &#x431;&#x443;&#x434;&#x435;&#x442; &#x433;&#x440;&#x443;&#x437;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43D;&#x435;&#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x442;&#x43D;&#x43E;.</p><pre><code>docker run --name nominatim --restart=always -d -p 8088:80 -h 192.168.0.71:8088/nominatim nominatim:latest</code></pre><h2 id="-nominatim">&#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; Nominatim</h2><p>&#x421;&#x443;&#x434;&#x44F; &#x43F;&#x43E; &#x432;&#x441;&#x435;&#x43C;&#x443;, &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x432; cron &#x437;&#x430;&#x434;&#x430;&#x447;&#x443; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;. &#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C; &#x437;&#x434;&#x435;&#x441;&#x44C;: <a href="https://github.com/openstreetmap/Nominatim/issues/1143" rel="nofollow noopener">https://github.com/openstreetmap/Nominatim/issues/1143</a></p><p>&#x421;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x432; Nominatim:</p><pre><code># &#x417;&#x430;&#x439;&#x442;&#x438; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;
sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --init-updates</code></pre><p>&#x41F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F;:</p><pre><code># &#x417;&#x430;&#x439;&#x442;&#x438; &#x432; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;
sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis-all</code></pre><p>&#x414;&#x43B;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x447;&#x435;&#x440;&#x435;&#x437; cron &#x434;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x432; &#x43D;&#x435;&#x433;&#x43E; &#x442;&#x430;&#x43A;&#x443;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; (&#x43E;&#x442; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; nominatim):</p><pre><code>sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis</code></pre><h2 id="--2">&#x420;&#x430;&#x437;&#x43D;&#x43E;&#x435;</h2><p>&#x41F;&#x43E;&#x447;&#x435;&#x43C;&#x443;-&#x442;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x434;&#x445;&#x432;&#x430;&#x442;&#x438;&#x43B;&#x438;&#x441;&#x44C; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x44B; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430; &#x438;&#x437; Dockerfile. &#x42D;&#x442;&#x43E; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#xA0;&#x442;&#x43E;&#x43C;&#x443;, &#x447;&#x442;&#x43E; &#x430;&#x43F;&#x434;&#x435;&#x439;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x441;&#x44F; &#x441; &#x434;&#x430;&#x43C;&#x43F;&#x430; &#x43F;&#x43B;&#x430;&#x43D;&#x435;&#x442;&#x44B;, &#x443;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#xA0;&#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;&#x430;. &#x422;&#x43E;&#x433;&#x434;&#x430; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B; &#xA0;/srv/nominatim/Nominatim/build/settings/settings.php:</p><pre><code>&#x41F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B; /srv/nominatim/Nominatim/build/settings/settings.php

&#x418;&#x437;&#x43C;&#x435;&#x43D;&#x44F;&#x435;&#x43C;:
@define(&apos;CONST_Replication_Url&apos;, &apos;https://download.geofabrik.de/russia/ural-fed-district-updates&apos;);
@define(&apos;CONST_Replication_Update_Interval&apos;, &apos;86400&apos;);
@define(&apos;CONST_Replication_Recheck_Interval&apos;, &apos;900&apos;);

&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C;:
@define(&apos;CONST_Replication_MaxInterval&apos;, &apos;86400&apos;);</code></pre><h2 id="--3">&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; &#x438;&#x437; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43D;&#x43E;&#x439; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x445;&#x43E;&#x441;&#x442;&#x430;</h2><p>&#x412;&#x43E;&#x442; &#x442;&#x430;&#x43A; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E;. &#x41D;&#x43E; &#x43B;&#x443;&#x447;&#x448;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x443; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; &#x432; cron.</p><pre><code>docker exec -it nominatim sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis
docker exec -it nominatim sudo -u nominatim /srv/nominatim/Nominatim/build/utils/update.php --import-osmosis-all</code></pre><!--kg-card-begin: markdown--><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;:<br>
<a href="https://github.com/merlinnot/nominatim-docker">https://github.com/merlinnot/nominatim-docker</a><br>
<a href="https://github.com/openstreetmap/Nominatim/issues/1143">https://github.com/openstreetmap/Nominatim/issues/1143</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Объединение дампов OSM]]></title><description><![CDATA[<p>&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x434;&#x430;&#x43C;&#x43F;&#x44B;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430;:</p><pre><code>https://download.geofabrik.de/asia/kazakhstan-latest.osm.pbf
https://download.geofabrik.de/russia/ural-fed-district-latest.osm.pbf</code></pre><p>&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x43F;&#x43E;&#x441;</p>]]></description><link>https://lanmaster.su/obiedinieniie-dampov-osm/</link><guid isPermaLink="false">5e5764af7824a90001b8ced7</guid><category><![CDATA[Openstreetmap]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Thu, 27 Feb 2020 06:43:12 GMT</pubDate><content:encoded><![CDATA[<p>&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x434;&#x430;&#x43C;&#x43F;&#x44B;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430;:</p><pre><code>https://download.geofabrik.de/asia/kazakhstan-latest.osm.pbf
https://download.geofabrik.de/russia/ural-fed-district-latest.osm.pbf</code></pre><p>&#x41A;&#x430;&#x447;&#x430;&#x435;&#x43C; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x44E;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; Osmosis:</p><pre><code>http://bretth.dev.openstreetmap.org/osmosis-build/osmosis-latest.zip</code></pre><p>&#x41A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x430; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;:</p><pre><code>osmosis --rb kazakhstan-latest.osm.pbf --rb ural-fed-district-latest.osm.pbf --merge --wb merged.pbf</code></pre><!--kg-card-begin: markdown--><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;:<br>
<a href="https://gis.stackexchange.com/questions/242704/how-to-merge-osm-pbf-files">https://gis.stackexchange.com/questions/242704/how-to-merge-osm-pbf-files</a><br>
<a href="https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.47">https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.47</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ограничение частоты запросов по API_KEY с использованием OpenResty и Docker]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x439; <a href="https://lanmaster.su/oghranichieniie-chastoty-zaprosov-po-api-key-s-ispolzovaniiem-nginx/">&#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; </a>&#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x44B;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x43D;, &#x434;&#x43B;&#x44F; &#x432;&#x43D;&#x435;&#x441;&#x435;&#x43D;&#x438;&#x44F;</p>]]></description><link>https://lanmaster.su/oghranichieniie-chastoty-zaprosov-po-api_key-s-ispolzovaniiem-openresty-i-docker/</link><guid isPermaLink="false">5e57636e7824a90001b8cea2</guid><category><![CDATA[nginx]]></category><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Thu, 27 Feb 2020 06:40:37 GMT</pubDate><content:encoded><![CDATA[<p>&#x41F;&#x440;&#x435;&#x434;&#x44B;&#x434;&#x443;&#x449;&#x438;&#x439; <a href="https://lanmaster.su/oghranichieniie-chastoty-zaprosov-po-api-key-s-ispolzovaniiem-nginx/">&#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442; </a>&#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x44B;&#x43B; &#x441;&#x442;&#x430;&#x442;&#x438;&#x447;&#x435;&#x43D;, &#x434;&#x43B;&#x44F; &#x432;&#x43D;&#x435;&#x441;&#x435;&#x43D;&#x438;&#x44F; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x439; &#x432; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; API-KEY &#xA0;&#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43B;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; Nginx. &#x41D;&#x443;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x434;&#x438;&#x43D;&#x430;&#x43C;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x43C;&#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x43C;&#x438;. &#xA0;OpenResty - &#x44D;&#x442;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x43B;&#x435;&#x43A;&#x441; &#x43F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x445; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x438;&#x439; &#x434;&#x43B;&#x44F; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; Nginx, &#x43D;&#x430; &#x435;&#x433;&#x43E; &#xA0;&#x431;&#x430;&#x437;&#x435; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x43C;&#x43E;&#x435;. &#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; Docker, &#x43E;&#x444;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x437; <a href="https://hub.docker.com/r/openresty/openresty" rel="nofollow noopener">OpenResty</a> &#x438; &#x43E;&#x444;&#x438;&#x446;&#x438;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x440;&#x430;&#x437; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; <a href="https://hub.docker.com/_/redis" rel="nofollow noopener">Redis</a>. Redis &#x431;&#x443;&#x434;&#x435;&#x442; &#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x432; &#x441;&#x435;&#x431;&#x435; API-&#x43A;&#x43B;&#x44E;&#x447;&#x438;.</p><p><strong>&#x417;&#x430;&#x434;&#x430;&#x447;&#x430;:</strong> &#x432;&#x441;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B;, &#x43F;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430;&#x44E;&#x449;&#x438;&#x435; &#x43D;&#x430; &#x430;&#x434;&#x440;&#x435;&#x441; <a href="http://192.168.0.71:8080/" rel="nofollow noopener">http://192.168.0.71:8080/</a> &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x442;&#x44C; &#x43D;&#x430; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430; API-KEY &#x438; &#x43D;&#x430; &#x435;&#x433;&#x43E; &#x431;&#x430;&#x437;&#x435; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#x440;&#x435;&#x448;&#x435;&#x43D;&#x438;&#x435; &#x43E; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;. &#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x441; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C;&#x438; API-KEY &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43D;&#x430; &#x430;&#x434;&#x440;&#x435;&#x441; <a href="http://192.168.0.72/" rel="nofollow noopener">http://192.168.0.72/</a>.</p><p><strong>&#x412;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;!</strong> &#x412;&#x441;&#x435; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x434;&#x44F;&#x442;&#x441;&#x44F; &#x43D;&#x430; &#x445;&#x43E;&#x441;&#x442;&#x435; 192.168.0.71!</p><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; Docker. &#x414;&#x43B;&#x44F; CentOS:</p><pre><code>yum install docker</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; OpenResty. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x43C;&#x44B; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;, &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#xA0;&#x432; &#x43D;&#x435;&#x433;&#x43E; &#x441; &#x445;&#x43E;&#x441;&#x442;&#x430; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x441; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430;&#x43C;&#x438; nginx, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x431;&#x44B;&#x43B;&#x43E; &#x443;&#x434;&#x43E;&#x431;&#x43D;&#x435;&#x435; &#x438;&#x445; &#xA0;&#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;:</p><pre><code>docker run -d \
--name openresty \
-p 8080:8080 \
-v /media/docker-data/openresty/etc/nginx/conf.d:/etc/nginx/conf.d \
openresty/openresty:alpine</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440; Redis. &#x417;&#x434;&#x435;&#x441;&#x44C; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x445;&#x43E;&#x441;&#x442;&#x430;, &#x434;&#x43B;&#x44F; &#xA0;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x43D;&#x430; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x439; &#x432;&#x43E;&#x441;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x440;&#x438; &#x430;&#x432;&#x430;&#x440;&#x438;&#x439;&#x43D;&#x44B;&#x445; &#x441;&#x438;&#x442;&#x443;&#x430;&#x446;&#x438;&#x44F;&#x445;:</p><pre><code>docker run -d \
--name redis \
-p 6379:6379 \
-v /media/docker-data/redis/data:/data \
redis redis-server --appendonly yes</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; nginx:</p><pre><code>#/media/docker-data/openresty/etc/nginx/conf.d/default.conf:

# &#x412;&#x44B;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x434;&#x43B;&#x44F; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x440;&#x430;&#x441;&#x447;&#x435;&#x442;&#x430; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B;
lua_shared_dict my_limit_req_store 100m;

server {

    listen       8080;
    server_name  192.168.0.71;

    location / {

        access_by_lua_file /etc/nginx/conf.d/apikey_module.lua;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://192.168.0.72/;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # &#x42D;&#x442;&#x43E;&#x442; &#x43F;&#x443;&#x442;&#x44C; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D; &#x43D;&#x430; &#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x442;&#x43D;&#x44B;&#x439; &#x434;&#x43B;&#x44F; OpenResty, &#x438;&#x43D;&#x430;&#x447;&#x435; &#x432; &#x43B;&#x43E;&#x433;&#x430;&#x445; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430; 404 &#x432;&#x43C;&#x435;&#x441;&#x442;&#x43E; 503,
    # &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;&#x443;, &#x447;&#x442;&#x43E; &#x444;&#x430;&#x439;&#x43B; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x44F; 503-&#x439; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438; &#x43D;&#x435; &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D;...
    location = /50x.html {
        root /usr/local/openresty/nginx/html;
    }
}</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442; LUA, &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C;&#x44B;&#x439; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x435; &#x432;&#x44B;&#x448;&#x435; (&#x441;&#x442;&#x440;&#x43E;&#x43A;&#x430; access_by_lua_file&#x2026;):</p><pre><code>#/media/docker-data/openresty/etc/nginx/conf.d/apikey_module.lua:

-- &#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x432; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x435; &#x444;&#x430;&#x439;&#x43B;&#x430;, &#x442;.&#x43A;. &#x438;&#x43D;&#x442;&#x435;&#x440;&#x43F;&#x440;&#x435;&#x442;&#x430;&#x442;&#x43E;&#x440; LUA &#x438;&#x43C;&#x435;&#x435;&#x442; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x443;&#x44E; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;&#x430; &#x438; &#x434;&#x43E;&#x43B;&#x436;&#x435;&#x43D; &#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x432;&#x44B;&#x437;&#x44B;&#x432;&#x430;&#x44E;&#x449;&#x438;&#x439;&#x441;&#x44F;
-- &#x43A;&#x43E;&#x434; &#x434;&#x43E; &#x435;&#x433;&#x43E; &#x432;&#x44B;&#x437;&#x43E;&#x432;&#x430;.

-- &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x432; &#x431;&#x430;&#x437;&#x435; Redis
function check_key(key)
    local redis = require &quot;resty.redis&quot;
    local red = redis:new()
    red:set_timeout(1000) -- 1 second
    - &#x417;&#x434;&#x435;&#x441;&#x44C; &#x443;&#x43A;&#x430;&#x436;&#x438;&#x442;&#x435; &#x441;&#x43E;&#x431;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x44B;&#x435; &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; Redis
    local ok, err = red:connect(&quot;192.168.0.71&quot;, 16379)

    -- &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x43A; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x443; Redis - &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433;
    if not ok then
        ngx.log(ngx.ERR, &quot;failed to connect to Redis server: &quot;, err)
        return false
    end

    -- &#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x432; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x435; Redis
    local value, err = red:get(key)

    -- &#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435; &#x443;&#x434;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; - &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433;
    if not value then
        ngx.log(ngx.ERR, &quot;failed to get key in Redis server: &quot;, err)
        return false
    end

    -- &#x415;&#x441;&#x43B;&#x438; &#x434;&#x43B;&#x44F; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x43D;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; - &#x442;&#x43E; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; false
    -- &#x438;&#x43D;&#x430;&#x447;&#x435; - &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x43C; true
    if value == ngx.null then
        ngx.log(ngx.ERR, &quot;no value found for key &quot;, key)
        return false
    else
        -- &#x41A;&#x43B;&#x44E;&#x447; &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D; &#x432; &#x431;&#x430;&#x437;&#x435; Redis, &#x43F;&#x438;&#x448;&#x435;&#x43C; &#x432; &#x43B;&#x43E;&#x433;. &#x423;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x442;&#x43E;&#x43C;.
        --ngx.log(ngx.ERR, &quot;key:&quot;, key, &quot; value:&quot;, value)
        return true
    end
end

--&#x424;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44F; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;
function limit_requests()
    local limit_req = require &quot;resty.limit.req&quot;
    -- my_limit_req_store &#x43F;&#x440;&#x43E;&#x43F;&#x438;&#x441;&#x44B;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x432; &#x43F;&#x435;&#x440;&#x435;&#x434; &#x431;&#x43B;&#x43E;&#x43A;&#x43E;&#x43C; server &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430; Nginx (default.conf)
    -- 200 &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x432; &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;&#x443; &#x441; &#x43E;&#x434;&#x43D;&#x43E;&#x433;&#x43E; IP (&#x438;&#x441;&#x43A;&#x43B;&#x44E;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x434;&#x43B;&#x44F; &#x442;&#x435;&#x441;&#x442;&#x43E;&#x432;)
    local lim, err = limit_req.new(&quot;my_limit_req_store&quot;, 200, 0)
    -- &#x415;&#x441;&#x43B;&#x438; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C; &#x43D;&#x435; &#x438;&#x43D;&#x438;&#x446;&#x438;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;, &#x442;&#x43E; &#x441;&#x43C;&#x438;&#x440;&#x435;&#x43D;&#x43D;&#x43E; &#x43E;&#x442;&#x434;&#x430;&#x434;&#x438;&#x43C; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x43D;&#x442;, &#x43D;&#x43E; &#x441; &#x437;&#x430;&#x434;&#x435;&#x440;&#x436;&#x43A;&#x43E;&#x439;
    if not lim then
        ngx.log(ngx.ERR, &quot;failed to instantiate a resty.limit.req object: &quot;, err)
        -- &#x421;&#x43F;&#x438;&#x43C; 1 &#x441;&#x435;&#x43A;
        ngx.sleep(1)
        return ngx.exit(200)
    end

    -- &#x41A;&#x43B;&#x44E;&#x447; &#x441;&#x447;&#x435;&#x442;&#x447;&#x438;&#x43A;&#x430; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; - IP &#x437;&#x430;&#x43F;&#x440;&#x430;&#x448;&#x438;&#x432;&#x430;&#x44E;&#x449;&#x435;&#x433;&#x43E;
    local key = ngx.var.binary_remote_addr
    local delay, err = lim:incoming(key, true)
    if not delay then
        -- &#x415;&#x441;&#x43B;&#x438; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43D;&#x435; &#x43F;&#x440;&#x43E;&#x43B;&#x430;&#x437;&#x438;&#x442; &#x43F;&#x43E; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x435; - &#x442;&#x43E; &#x434;&#x430;&#x435;&#x43C; &#x43E;&#x442;&#x432;&#x435;&#x442; 503
        if err == &quot;rejected&quot; then
            ngx.log(ngx.ERR, &quot;delay rejected: &quot;, err)
            return ngx.exit(503)
        end
        ngx.log(ngx.ERR, &quot;failed to limit req: &quot;, err)
        return ngx.exit(503)
    end

    if delay&gt;= 0.001 then
        local excess = err
        ngx.sleep(delay)
    end
end

-- &#x418;&#x449;&#x435;&#x43C; &#x43A;&#x43B;&#x44E;&#x447; API_KEY &#x432; &#x437;&#x430;&#x433;&#x43E;&#x43B;&#x43E;&#x432;&#x43A;&#x430;&#x445;
local key = ngx.var.http_api_key

-- &#x415;&#x441;&#x43B;&#x438; &#x43A;&#x43B;&#x44E;&#x447; &#x435;&#x441;&#x442;&#x44C;, &#x442;&#x43E; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x43F;&#x43E; &#x431;&#x430;&#x437;&#x435; Redis
if key then
    -- &#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x43D;&#x430; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x435; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x432; &#x431;&#x430;&#x437;&#x435; Redis
    local key_exist = check_key(key)
    -- &#x415;&#x441;&#x43B;&#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x430; &#x43D;&#x435;&#x442; - &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x43C; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x44E; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;
    if not key_exist then
        ngx.log(ngx.ERR, &quot;check_key() returned false&quot;)
        limit_requests()
    end
else
    limit_requests()
end</code></pre><p>&#x414;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x439; &#x432; Redis &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; &#x43A;&#x43E;&#x43D;&#x441;&#x43E;&#x43B;&#x44C;:</p><pre><code>docker run -it --link redis:redis --rm redis redis-cli -h redis -p 6379
#&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43A;&#x43B;&#x44E;&#x447;&#x438;:
redis:6379&gt; set 111 &quot;&quot;
redis:6379&gt; set 222 &quot;&quot;
redis:6379&gt; set 333 &quot;&quot;
quit</code></pre><p><strong>&#x418;&#x441;&#x43F;&#x44B;&#x442;&#x430;&#x43D;&#x438;&#x44F;.</strong></p><pre><code># &#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43D;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43E;&#x447;&#x43D;&#x43E;&#x433;&#x43E; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x430; &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x43F;&#x44B;&#x442;&#x430;&#x43D;&#x438;&#x439;
yum install siege</code></pre><p>&#x41A;&#x43E;&#x434;&#x44B; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x43E;&#x432;: (200 - &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x443;&#x448;&#x435;&#x43B; &#x43D;&#x430; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x438;&#x439; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;, 503 - &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43E;&#x442;&#x431;&#x440;&#x43E;&#x448;&#x435;&#x43D;).<br>10 &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; <strong>&#x441; &#x43D;&#x435;&#x432;&#x435;&#x440;&#x43D;&#x44B;&#x43C; &#x43A;&#x43B;&#x44E;&#x447;&#x43E;&#x43C;</strong>:</p><pre><code>[root@localhost ~]# siege -b -r 1 -c 10 -H &quot;API-KEY: 1aaa111&quot; http://192.168.0.71:8080/icons/ubuntu-logo.png
** SIEGE 4.0.2
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.02 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.03 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png</code></pre><p>10 &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; <strong>&#x431;&#x435;&#x437; &#x43A;&#x43B;&#x44E;&#x447;&#x430;</strong>:</p><pre><code>[root@localhost ~]# siege -b -r 1 -c 10 http://192.168.0.71:8080/icons/ubuntu-logo.png
** SIEGE 4.0.2
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.01 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.02 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.02 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.02 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 503     0.02 secs:     541 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png</code></pre><p>10 &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; <strong>&#x441; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43A;&#x43B;&#x44E;&#x447;&#x43E;&#x43C;</strong>:</p><pre><code>[root@localhost ~]# siege -b -r 1 -c 10 -H &quot;API-KEY: 111&quot; http://192.168.0.71:8080/icons/ubuntu-logo.png
** SIEGE 4.0.2
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.01 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.01 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.01 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.01 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png
HTTP/1.1 200     0.02 secs:    3338 bytes ==&gt; GET  /icons/ubuntu-logo.png</code></pre><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;:</p><ul><li><a href="https://habr.com/ru/company/southbridge/blog/329876/#nuzhny-li-ogranichenie-skorosti-i-sheyping-trafika" rel="nofollow noopener">https://habr.com/ru/company/southbridge/blog/329876/#nuzhny-li-ogranichenie-skorosti-i-sheyping-trafika</a></li><li><a href="https://hub.docker.com/r/openresty/openresty" rel="nofollow noopener">https://hub.docker.com/r/openresty/openresty</a></li><li><a href="https://hub.docker.com/_/redis" rel="nofollow noopener">https://hub.docker.com/_/redis</a></li><li><a href="http://openresty.org/en/dynamic-routing-based-on-redis.html" rel="nofollow noopener">http://openresty.org/en/dynamic-routing-based-on-redis.html</a></li><li><a href="https://github.com/openresty/lua-resty-limit-traffic" rel="nofollow noopener">https://github.com/openresty/lua-resty-limit-traffic</a></li><li><a href="https://habr.com/ru/post/215235/" rel="nofollow noopener">https://habr.com/ru/post/215235/</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Ограничение частоты запросов по API-KEY с использованием Nginx]]></title><description><![CDATA[<p>&#x425;&#x43E;&#x442;&#x438;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x43A;&#x43E;&#x433;&#x43E;-&#x442;</p>]]></description><link>https://lanmaster.su/oghranichieniie-chastoty-zaprosov-po-api-key-s-ispolzovaniiem-nginx/</link><guid isPermaLink="false">5e5762447824a90001b8ce94</guid><category><![CDATA[nginx]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Thu, 27 Feb 2020 06:32:12 GMT</pubDate><content:encoded><![CDATA[<p>&#x425;&#x43E;&#x442;&#x438;&#x43C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x43A;&#x43E;&#x433;&#x43E;-&#x442;&#x43E; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x430;. &#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;:</p><pre><code>http://test.one/somefile_105_907.png</code></pre><p>&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x435;&#x43C; nginx. &#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x43D;&#x430; &#x431;&#x430;&#x437;&#x435; CentOS 7.<br>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x432; nginx &#x440;&#x435;&#x432;&#x435;&#x440;&#x441;&#x438;&#x432;&#x43D;&#x44B;&#x439; &#x43F;&#x440;&#x43E;&#x43A;&#x441;&#x438;. &#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x441;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x431;&#x443;&#x434;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x442;&#x44C; &#xA0;&#x43D;&#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; &#x430;&#x434;&#x440;&#x435;&#x441;, &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x442;&#x44C; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x443; &#x43F;&#x43E;&#x441;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x44F; &#x438; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x43D;&#x430; &#xA0;&#x441;&#x442;&#x430;&#x440;&#x44B;&#x439; &#x430;&#x434;&#x440;&#x435;&#x441;. &#x41D;&#x43E;&#x432;&#x44B;&#x439; &#x430;&#x434;&#x440;&#x435;&#x441;:</p><pre><code>http://test.two/somefile_105_907.png</code></pre><p>&#x412; &#x43D;&#x430;&#x447;&#x430;&#x43B;&#x43E; &#x431;&#x43B;&#x43E;&#x43A;&#x430; http &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43C;&#x430;&#x43F;&#x43F;&#x438;&#x43D;&#x433; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x434;&#x43B;&#x44F; API-&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x439;, &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x435;&#x43C; &#x432; &#x43D;&#x435;&#x433;&#x43E; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x439; &#x444;&#x430;&#x439;&#x43B; &#x441; &#x441;&#x430;&#x43C;&#x438;&#x43C;&#x438; &#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x43C;&#x438;, &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x43E; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430;:</p><pre><code>#/etc/nginx/nginx.conf:

http {

    map $http_api_key $limit {
        include /etc/nginx/conf.d/apikeys.map;
        default $binary_remote_addr;
    }

    limit_req_zone $limit zone=apikey:10m rate=12r/m;

    # &#x422;&#x443;&#x442; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x430;&#x44F; &#x447;&#x430;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x436;&#x43D;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430;...
}</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x441;&#x430;&#x43C; &#x444;&#x430;&#x439;&#x43B; &#x441; &#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x43C;&#x438;:</p><pre><code>#/etc/nginx/conf.d/apikeys.map:

111 &apos;&apos;;
222 &apos;&apos;;</code></pre><p>&#x41C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x431;&#x43B;&#x43E;&#x43A; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x434;&#x435;&#x444;&#x43E;&#x43B;&#x442;&#x43D;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; nginx (&#x431;&#x43B;&#x43E;&#x43A; server / location):</p><pre><code>#/etc/nginx/conf.d/default.conf:
server {
    listen       80;
    server_name  test.two;

    location / {
        limit_req zone=apikey nodelay;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://test.one/;
    }
}</code></pre><p>&#x412;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;! default.conf &#x432;&#x437;&#x44F;&#x442; &#x434;&#x43B;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x438;&#x437;&#x430;&#x446;&#x438;&#x438; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x430;, &#x432; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x443;&#x441;&#x43B;&#x43E;&#x432;&#x438;&#x44F;&#x445; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x443;&#x439;&#x442;&#x435; &#x441;&#x432;&#x43E;&#x438; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x438;.</p><p>&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B;:</p><ul><li>&#x417;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43F;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x430;&#x435;&#x442; &#x43D;&#x430; <a href="http://test.one/somefile_105_907.png" rel="nofollow noopener">http://test.two/somefile_105_907.png</a></li><li>&#x410;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; HTTP-Header &#xAB;API-KEY&#xBB;. &#x411;&#x435;&#x440;&#x435;&#x442;&#x441;&#x44F; &#x435;&#x433;&#x43E; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x432; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x443;&#x44E; $http_api_key</li><li>$http_api_key &#x441;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x441;&#x43E; &#x441;&#x43F;&#x438;&#x441;&#x43A;&#x43E;&#x43C; &#x438;&#x437; &#x444;&#x430;&#x439;&#x43B;&#x430; apikeys.map</li><li>&#x415;&#x441;&#x43B;&#x438; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x435; &#x43D;&#x430;&#x439;&#x434;&#x435;&#x43D;&#x43E;, &#x442;&#x43E; &#xA0;&#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; $limit &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x443;&#x441;&#x442;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; (&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43D;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#xA0;&#x443;&#x447;&#x430;&#x441;&#x442;&#x432;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x432; &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x435; &#x447;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x44B; &#x43E;&#x431;&#x440;&#x430;&#x449;&#x435;&#x43D;&#x438;&#x439;)</li><li>&#x415;&#x441;&#x43B;&#x438; &#x43D;&#x435;&#x442; &#x441;&#x43E;&#x43E;&#x442;&#x432;&#x435;&#x442;&#x441;&#x442;&#x432;&#x438;&#x44F;, &#x442;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#xA0;$limit &#x443;&#x441;&#x442;&#x430;&#x43D;&#x430;&#x432;&#x43B;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;, &#x440;&#x430;&#x432;&#x43D;&#x43E;&#x435; IP &#x430;&#x434;&#x440;&#x435;&#x441;&#x443; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x430;. &#x422;&#x430;&#x43A;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#xA0;&#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x430;&#x442;&#x44B;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x430;&#x43C;, &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x43C; &#x432; limit_req_zone. &#x427;&#x430;&#x441;&#x442;&#x43E;&#x442;&#x430; &#xA0;&#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x430; (1 &#x440;&#x430;&#x437; / 5 &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;) (rate=12r/m);</li><li>&#x415;&#x441;&#x43B;&#x438; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; - &#x442;&#x43E; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441; &#x43F;&#x435;&#x440;&#x435;&#x434;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x430; <a href="http://test.one/somefile_105_907.png" rel="nofollow noopener">http://test.one/somefile_105_907.png</a>, &#x43E;&#x442;&#x432;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x432;&#x440;&#x430;&#x449;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x442;&#x43D;&#x43E;.</li></ul><p>&#x41F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x44B; CURL:</p><pre><code># &#x422;&#x430;&#x43A;&#x438;&#x435; &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43F;&#x440;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x431;&#x435;&#x437; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x439;:
curl &quot;http://test.two/somefile_105_907.png&quot; -H &quot;Api-Key: 111&quot;
curl &quot;http://test.two/somefile_105_907.png&quot; -H &quot;Api-Key: 222&quot;

# &#x410; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x431;&#x443;&#x434;&#x443;&#x442; &#x444;&#x438;&#x43B;&#x44C;&#x442;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x43F;&#x43E; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x430;&#x43C;:
curl &quot;http://test.two/somefile_105_907.png&quot; -H &quot;Api-Key: 121&quot;
curl &quot;http://test.two/somefile_105_907.png&quot;</code></pre><p>&#x421;&#x441;&#x44B;&#x43B;&#x43A;&#x438;:</p><p><a href="https://serverfault.com/questions/784852/nginx-conf-for-limit-req-based-on-http-header" rel="nofollow noopener">https://serverfault.com/questions/784852/nginx-conf-for-limit-req-based-on-http-header</a> <br> <a href="http://nginx.org/ru/docs/http/ngx_http_limit_req_module.html" rel="nofollow noopener">http://nginx.org/ru/docs/http/ngx_http_limit_req_module.html</a> <br> <a href="http://nginx.org/ru/docs/http/ngx_http_map_module.html" rel="nofollow noopener">http://nginx.org/ru/docs/http/ngx_http_map_module.html</a> <br> <a href="https://habr.com/ru/company/southbridge/blog/329876/" rel="nofollow noopener">https://habr.com/ru/company/southbridge/blog/329876/</a></p>]]></content:encoded></item><item><title><![CDATA[Vaadin . Настройка времени жизни устаревших UI.]]></title><description><![CDATA[<p>Vaadin 14.1.17</p><p>&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; Jetty-embedded &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44F;&#x43C;&#x438; Vaadin. &#x413;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x435; &#x442;&#x440;&#x435;</p>]]></description><link>https://lanmaster.su/vaadin-nastroika/</link><guid isPermaLink="false">5e563853cd815b0001e74199</guid><category><![CDATA[Vaadin 14]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Wed, 26 Feb 2020 09:44:07 GMT</pubDate><content:encoded><![CDATA[<p>Vaadin 14.1.17</p><p>&#x41D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; Jetty-embedded &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x44B; &#x441; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44F;&#x43C;&#x438; Vaadin. &#x413;&#x43B;&#x430;&#x432;&#x43D;&#x44B;&#x435; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; - &#x431;&#x435;&#x441;&#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x441;&#x435;&#x441;&#x441;&#x438;&#x44F; &#x43F;&#x440;&#x438; &#x430;&#x43A;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; UI &#x432; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x435; &#x438; &#x43C;&#x430;&#x43A;&#x441;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x431;&#x44B;&#x441;&#x442;&#x440;&#x43E;&#x435; &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x44B;&#x445; UI (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x430;).</p><pre><code>// &#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x430; &#x434;&#x43B;&#x44F; &#x430;&#x432;&#x442;&#x43E;-&#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x44F; &#x443;&#x441;&#x442;&#x430;&#x440;&#x435;&#x432;&#x448;&#x438;&#x445; &#x441;&#x435;&#x441;&#x441;&#x438;&#x439;. 
// &#x425;&#x43E;&#x442;&#x44F; &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x443;&#x441;&#x442;&#x430;&#x440;&#x435;&#x432;&#x448;&#x438;&#x435; UI, &#x430; &#x43D;&#x435; &#x441;&#x435;&#x441;&#x441;&#x438;&#x438;.
System.setProperty(&quot;vaadin.closeIdleSessions&quot;, &quot;true&quot;);
// &#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43F;&#x435;&#x440;&#x438;&#x43E;&#x434;&#x438;&#x447;&#x43D;&#x43E;&#x441;&#x442;&#x438; &quot;&#x436;&#x438;&#x432;&#x43E;&#x441;&#x442;&#x438;&quot; UI, &#x432; &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;&#x430;&#x445;
System.setProperty(&quot;vaadin.heartbeatInterval&quot;, &quot;10&quot;);

Server server = new Server();
WebAppContext webAppContext = createWebAppContext();
server.setHandler(webAppContext);
WebSocketServerContainerInitializer.initialize(webAppContext);
server.start();

// &#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43F;&#x435;&#x440;&#x438;&#x43E;&#x434;&#x430; &quot;&#x432;&#x435;&#x447;&#x43D;&#x43E;&#x439; &#x436;&#x438;&#x437;&#x43D;&#x438;&quot; &#x434;&#x43B;&#x44F; UI.
webAppContext.getSessionHandler().setMaxInactiveInterval(-1);</code></pre><!--kg-card-begin: markdown--><p>Vaadin &#x43F;&#x440;&#x438;&#x437;&#x43D;&#x430;&#x451;&#x442; UI &#x434;&#x43E;&#x445;&#x43B;&#x43E;&#x439; &#x432; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;, &#x43A;&#x43E;&#x433;&#x434;&#x430; 3 &#x440;&#x430;&#x437;&#x430; &#x43F;&#x43E;&#x434;&#x440;&#x44F;&#x434; &#x43D;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442; &#x43E;&#x442;&#x432;&#x435;&#x442;&#x44B; &#x43D;&#x430; heartbeat. &#x41F;&#x435;&#x440;&#x438;&#x43E;&#x434;&#x438;&#x447;&#x43D;&#x43E;&#x441;&#x442;&#x44C; heartbeat &#x43F;&#x43E; &#x443;&#x43C;&#x43E;&#x43B;&#x447;&#x430;&#x43D;&#x438;&#x44E; &#x440;&#x430;&#x432;&#x43D;&#x430; 5 &#x43C;&#x438;&#x43D;&#x443;&#x442;&#x430;&#x43C;.<br>
&#x41D;&#x430;&#x448;&#x430; &#x437;&#x430;&#x434;&#x430;&#x447;&#x430; &#x441;&#x43D;&#x438;&#x437;&#x438;&#x442;&#x44C; &#x44D;&#x442;&#x443; &#x43F;&#x435;&#x440;&#x438;&#x43E;&#x434;&#x438;&#x447;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x432;&#x44B;&#x431;&#x440;&#x430;&#x43D; &#x43F;&#x435;&#x440;&#x438;&#x43E;&#x434; 10 &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; (&#x438;&#x43B;&#x438; &#x435;&#x435; &#x437;&#x430;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x438;) UI &#x431;&#x443;&#x434;&#x435;&#x442; &#x441;&#x447;&#x438;&#x442;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x436;&#x438;&#x432;&#x44B;&#x43C; &#x435;&#x449;&#x435; &#x447;&#x443;&#x442;&#x44C; &#x431;&#x43E;&#x43B;&#x435;&#x435; 30 &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434;. &#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x447;&#x435;&#x433;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x440;&#x435;&#x430;&#x43A;&#x446;&#x438;&#x44E; detachListener.<br>
<a href="https://vaadin.com/docs/v14/flow/advanced/tutorial-application-lifecycle.html#application.lifecycle.ui-expiration">&#x41F;&#x440;&#x43E; heartbeat</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Установка и настройка движка Ghost в контейнере Docker.]]></title><description><![CDATA[<p>&#x41F;&#x440;&#x43E;&#x431;&#x440;&#x43E;&#x441;&#x438;&#x43B; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x439; &#x43F;&#x43E;&#x440;&#x442; 57443 &#x43D;&#x430; &#x43F;&#x43E;&#x440;&#x442; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; 57443. &#x41F;&#x43E;&#x440;&#x442; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x441;&#x43B;&#x443;&#x448;</p>]]></description><link>https://lanmaster.su/ustanovka-i-nastroika-dvizhka-ghost/</link><guid isPermaLink="false">5e561a7fcd815b0001e74171</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Wed, 26 Feb 2020 07:17:06 GMT</pubDate><content:encoded><![CDATA[<p>&#x41F;&#x440;&#x43E;&#x431;&#x440;&#x43E;&#x441;&#x438;&#x43B; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x438;&#x439; &#x43F;&#x43E;&#x440;&#x442; 57443 &#x43D;&#x430; &#x43F;&#x43E;&#x440;&#x442; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; 57443. &#x41F;&#x43E;&#x440;&#x442; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x441;&#x43B;&#x443;&#x448;&#x430;&#x435;&#x442; nginx. &#x41A;&#x43E;&#x43D;&#x444;&#x438;&#x433; nginx &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x448;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; SSL, &#x437;&#x430;&#x432;&#x43E;&#x440;&#x430;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; HTTP &#x442;&#x440;&#x430;&#x444;&#x438;&#x43A; &#x43E;&#x442; &#x434;&#x43E;&#x43A;&#x435;&#x440;-&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430; Ghost &#x432; SSL-&#x43E;&#x431;&#x435;&#x440;&#x442;&#x43A;&#x443;. nginx &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442; &#x442;&#x440;&#x430;&#x444;&#x438;&#x43A; &#x43D;&#x430; &#x43F;&#x43E;&#x440;&#x442; 2368 &#x434;&#x43E;&#x43A;&#x435;&#x440;-&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;.</p><p>&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x434;&#x43E;&#x43A;&#x435;&#x440;-&#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x430;:</p><pre><code>docker run -d \
--name ghostcms \
-e url=https://lanmaster.su:57443 \
-p 2368:2368 \
-v /mnt/lanmaster-data/ghostcms:/var/lib/ghost/content \
ghost
</code></pre><!--kg-card-begin: markdown--><p>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438;:<br>
<a href="https://github.com/godofredoninja/simply#5-search">&#x421;&#x442;&#x438;&#x43B;&#x44C; &#x438; &#x43F;&#x43E;&#x438;&#x441;&#x43A; &#x434;&#x43B;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430;</a></p>
<!--kg-card-end: markdown--><p></p>]]></content:encoded></item><item><title><![CDATA[socks4_client]]></title><description><![CDATA[<p>&#x42D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435; &#x445;&#x432;&#x430;&#x442;&#x430;&#x43B;&#x43E; &#x432; &#x43C;&#x43E;&#x435;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x435;:</p><pre><code>yum install -y gcc gcc-c++ autoconf automake</code></pre><pre><code>mkdir /home/your_user/proxychains
cd /home/your_user/proxychains
git clone https://github.com/rofl0r/proxychains-ng.</code></pre>]]></description><link>https://lanmaster.su/socks4_client/</link><guid isPermaLink="false">5e55053acd815b0001e74142</guid><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Tue, 25 Feb 2020 11:38:13 GMT</pubDate><content:encoded><![CDATA[<p>&#x42D;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435; &#x445;&#x432;&#x430;&#x442;&#x430;&#x43B;&#x43E; &#x432; &#x43C;&#x43E;&#x435;&#x439; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x435;:</p><pre><code>yum install -y gcc gcc-c++ autoconf automake</code></pre><pre><code>mkdir /home/your_user/proxychains
cd /home/your_user/proxychains
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng
./configure &amp;&amp; make &amp;&amp; sudo make install
make install-config</code></pre><p>&#x41C;&#x435;&#x43D;&#x44F;&#x435;&#x43C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A; Socks4 &#x43D;&#x430; &#x441;&#x432;&#x43E;&#x44E; (&#x432; &#x43A;&#x43E;&#x43D;&#x446;&#x435; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x430;).<br>&#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x442;&#x430;&#x43A;: socks4 192.168.0.70 7788</p><pre><code>vi /usr/local/etc/proxychains.conf</code></pre><p>&#x420;&#x430;&#x437;&#x43C;&#x435;&#x449;&#x430;&#x435;&#x43C; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x43D;&#x44F;&#x435;&#x43C;&#x44B;&#x439; &#x444;&#x430;&#x439;&#x43B; &#x432; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x435;</p><pre><code>sudo mv ./proxychains4 /usr/bin/
</code></pre><p>&#x418;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;:</p><pre><code>proxychains4 wget https://download.geofabrik.de/russia-latest.osm.pbf
</code></pre><p>&#x427;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; Docker &#x442;&#x43E;&#x436;&#x435; &#x445;&#x43E;&#x434;&#x438;&#x442;&#x44C; &#x447;&#x435;&#x440;&#x435;&#x437; &#x43F;&#x440;&#x43E;&#x43A;&#x441;&#x438;:</p><pre><code>1. &#x412; &#x444;&#x430;&#x439;&#x43B;&#x435; /etc/sysconfig/docker &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x43E;&#x447;&#x43A;&#x438;:
    all_proxy=&quot;socks5://192.168.0.70:7788&quot;
    #http_proxy=&quot;http://192.168.0.70:7788&quot;
    #https_proxy=&quot;http://192.168.0.70:7788&quot;
2. systemctl daemon-reload
3. service docker restart</code></pre><!--kg-card-begin: markdown--><p><strong>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;:</strong><br>
<a href="http://pinewong.com/posts/5-proxy-in-centos-7">http://pinewong.com/posts/5-proxy-in-centos-7</a><br>
<a href="https://crondev.com/running-docker-behind-proxy/">https://crondev.com/running-docker-behind-proxy/</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Старая версия сайта]]></title><description><![CDATA[<p><a href="https://lanmaster.su:57443/">https://lanmaster.su:57443/</a></p><p>&#x41D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;.</p>]]></description><link>https://lanmaster.su/staraia-viersiia-saita/</link><guid isPermaLink="false">5e576fa97824a90001b8cf4c</guid><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Sun, 23 Feb 2020 07:28:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://lanmaster.su:57443/">https://lanmaster.su:57443/</a></p><p>&#x41D;&#x435; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442;&#x441;&#x44F;.</p>]]></content:encoded></item><item><title><![CDATA[Kanboard]]></title><description><![CDATA[<p><a href="https://kanboard.org/" rel="nofollow noopener">https://kanboard.org/</a></p><p>Best kanban board for me!</p>]]></description><link>https://lanmaster.su/kanboard/</link><guid isPermaLink="false">5e576f517824a90001b8cf42</guid><category><![CDATA[Kanboard]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Tue, 05 Mar 2019 07:27:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://kanboard.org/" rel="nofollow noopener">https://kanboard.org/</a></p><p>Best kanban board for me!</p>]]></content:encoded></item><item><title><![CDATA[Установка и настройка своего тайл-сервера.]]></title><description><![CDATA[<h2 id="-">&#x412;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;! </h2><p>&#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; docker-&#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x442;&#x430;&#x439;&#x43B;-&#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;</p>]]></description><link>https://lanmaster.su/ustanovka-i-nastroika-svoiegho-sierviera-tail-ghienieratora/</link><guid isPermaLink="false">5e5769407824a90001b8cf0e</guid><category><![CDATA[Openstreetmap]]></category><category><![CDATA[Mapnik]]></category><dc:creator><![CDATA[Lanmaster]]></dc:creator><pubDate>Tue, 05 Feb 2019 07:01:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="-">&#x412;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;! </h2><p>&#x421;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x435;&#x442; docker-&#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x442;&#x430;&#x439;&#x43B;-&#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;, &#x43F;&#x43E;&#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x441;&#x438;&#x43B;&#x44C;&#x43D;&#x43E; &#x43D;&#x435; &#x43F;&#x43E;&#x433;&#x440;&#x443;&#x436;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x44D;&#x442;&#x443; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x44E;.</p><h2 id="--1">&#x422;&#x435;&#x445;&#x43D;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x442;&#x440;&#x435;&#x431;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; (&#x430;&#x43A;&#x442;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x432; &#x43C;&#x43E;&#x435;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435;)</h2><!--kg-card-begin: markdown--><ul>
<li>&#x41C;&#x438;&#x43D;&#x438;&#x43C;&#x443;&#x43C; &#x41E;&#x417;&#x423;: 12 &#x413;&#x431;</li>
<li>CPU: &#x447;&#x435;&#x43C; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x44F;&#x434;&#x435;&#x440;, &#x442;&#x435;&#x43C; &#x43B;&#x443;&#x447;&#x448;&#x435;</li>
<li>HDD: &#x414;&#x43B;&#x44F; &#x434;&#x430;&#x43C;&#x43F;&#x430; &#x420;&#x43E;&#x441;&#x441;&#x438;&#x438; &#x438; &#x43F;&#x430;&#x440;&#x44B; &#x441;&#x442;&#x438;&#x43B;&#x435;&#x439; 120 &#x413;&#x431; SSD</li>
</ul>
<!--kg-card-end: markdown--><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x43E;&#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x43B;&#x44F;&#x43B;&#x430;&#x441;&#x44C; &#x43D;&#x430; &#x447;&#x438;&#x441;&#x442;&#x443;&#x44E; Ubuntu 1804, &#x440;&#x430;&#x437;&#x43C;&#x435;&#x449;&#x435;&#x43D;&#x43D;&#x443;&#x44E; &#x432; VirtualBox &#x43D;&#x430; &#x43A;&#x43E;&#x43D;&#x442;&#x435;&#x439;&#x43D;&#x435;&#x440;&#x435; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440;&#x43E;&#x43C; 100&#x413;&#x431;. <br>&#x412;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x435;! &#x41F;&#x440;&#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x435; Ubuntu &#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43B; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44F; alexander &#x441; &#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x435;&#x43C; &#xA0;&apos;1&apos;. &#x41E;&#x43D; &#x436;&#x435; &#x431;&#x443;&#x434;&#x435;&#x442; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x443;&#x447;&#x435;&#x442;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x438;&#x441;&#x438; &#x431;&#x430;&#x437;&#x44B; PostgreSQL.</p><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;: <br><a href="https://switch2osm.org/manually-building-a-tile-server-18-04-lts/" rel="nofollow noopener">https://switch2osm.org/manually-building-a-tile-server-18-04-lts/</a></p><p>&#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x438; &#x438; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x44B;</p><pre><code>sudo apt-get update
sudo apt-get upgrade
sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg curl</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;</p><pre><code>sudo apt-get install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x431;&#x430;&#x437;&#x443;. &#x41B;&#x43E;&#x433;&#x438;&#x43D;&#x438;&#x43C;&#x441;&#x44F; &#x43F;&#x43E;&#x434; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43C; postgres</p><pre><code>sudo -u postgres -i</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x443;&#x447;&#x435;&#x442;&#x43A;&#x443; &#x411;&#x414; &#x441; &#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x435;&#x43C;</p><pre><code>createuser alexander --pwprompt</code></pre><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x431;&#x430;&#x437;&#x443; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; <strong>gis</strong></p><pre><code>createdb -E UTF8 -O alexander gis
psql
    \c gis
    CREATE EXTENSION postgis;
    CREATE EXTENSION hstore;
    ALTER TABLE geometry_columns OWNER TO alexander;
    ALTER TABLE spatial_ref_sys OWNER TO alexander;
    \q
    exit</code></pre><p>&#x412; &#x434;&#x43E;&#x43C;&#x430;&#x448;&#x43D;&#x435;&#x439; &#x43F;&#x430;&#x43F;&#x43A;&#x435; alexander &#x434;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x443;&#x44E; &#x43F;&#x430;&#x43F;&#x43A;&#x443; src:</p><pre><code>mkdir ~/src</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; osm2pgsql</p><pre><code>cd ~/src
git clone git://github.com/openstreetmap/osm2pgsql.git
cd osm2pgsql
sudo apt install make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev
mkdir build &amp;&amp; cd build
cmake ..
make
sudo make install</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; mapnik</p><pre><code>sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik
python
# &#x41A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;:
    import mapnik
    quit()</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; mod_tile + renderd</p><pre><code>cd ~/src
git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git
cd mod_tile
./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile
sudo ldconfig</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; carto</p><pre><code>sudo apt install npm nodejs
sudo npm install -g carto
carto -v</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x441;&#x442;&#x438;&#x43B;&#x44F; Openstreetmap-Carto</p><pre><code>cd ~/src
git clone git://github.com/gravitystorm/openstreetmap-carto.git
cd openstreetmap-carto
# &#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; mapnik.xml &#x43D;&#x430; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x435; &#x441;&#x442;&#x438;&#x43B;&#x44F; project.mml
carto project.mml&gt; mapnik.xml</code></pre><p>&#x417;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; OSM PBF &#x441; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; <a href="https://download.geofabrik.de/russia.html" rel="nofollow noopener">https://download.geofabrik.de/russia.html</a></p><pre><code>mkdir ~/data
cd ~/data
wget https://download.geofabrik.de/russia-181224.osm.pbf</code></pre><p>&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; PBF &#x21D2; &#x431;&#x430;&#x437;&#x430; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; <strong>gis</strong></p><pre><code>osm2pgsql -d gis -U alexander -W --create --slim  -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/russia-181224.osm.pbf</code></pre><p>&#x417;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x430; &#x448;&#x435;&#x439;&#x43F;&#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432; &#x434;&#x43B;&#x44F; &#x433;&#x440;&#x430;&#x43D;&#x438;&#x446; &#x441;&#x442;&#x440;&#x430;&#x43D;/&#x440;&#x435;&#x433;&#x438;&#x43E;&#x43D;&#x43E;&#x432; &#x432; &#x43D;&#x438;&#x437;&#x43A;&#x43E;&#x43C; &#x437;&#x443;&#x43C;&#x435;</p><pre><code>cd ~/src/openstreetmap-carto
scripts/get-shapefiles.py</code></pre><p>&#x423;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x448;&#x440;&#x438;&#x444;&#x442;&#x43E;&#x432;</p><pre><code>sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont</code></pre><p>&#x41F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x435;&#x440;&#x430;</p><pre><code>vi /usr/local/etc/renderd.conf
# &#x412;&#x43D;&#x43E;&#x441;&#x438;&#x43C; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F;:
    XML=~/openstreetmap-carto/src/openstreetmap-carto/mapnik.xml</code></pre><p>&#x41F;&#x43E;&#x434;&#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43A;&#x430; Apache</p><pre><code>sudo mkdir /var/lib/mod_tile
sudo chown alexander /var/lib/mod_tile
sudo mkdir /var/run/renderd
sudo chown alexander /var/run/renderd

# &#x41F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B; /etc/apache2/conf-available/mod_tile.conf (&#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x438; &#x43D;&#x435;&#x43E;&#x431;&#x445;&#x43E;&#x434;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438;)
# &#x422;&#x435;&#x43A;&#x441;&#x442; &#x432; &#x444;&#x430;&#x439;&#x43B;&#x435;:
    LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

sudo a2enconf mod_tile

# &#x41F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B; /etc/apache2/sites-available/000-default.conf
# &#x414;&#x43E;&#x431;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x438; &#x43C;&#x435;&#x436;&#x434;&#x443; &quot;ServerAdmin&quot; &#x438; &quot;DocumentRoot&quot;:
    LoadTileConfigFile /usr/local/etc/renderd.conf
    ModTileRenderdSocketName /var/run/renderd/renderd.sock
    # Timeout before giving up for a tile to be rendered
    ModTileRequestTimeout 0
    # Timeout before giving up for a tile to be rendered that is otherwise missing
    ModTileMissingRequestTimeout 30

# &#x414;&#x432;&#x430;&#x436;&#x434;&#x44B; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; Apache
sudo service apache2 reload
sudo service apache2 reload</code></pre><p>&#x41F;&#x43E;&#x434;&#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43A;&#x430; renderd</p><pre><code>#&#x41F;&#x440;&#x43E;&#x431;&#x443;&#x435;&#x43C; &#x440;&#x443;&#x447;&#x43D;&#x43E;&#x439; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; renderd
renderd -f -c /usr/local/etc/renderd.conf

# &#x418;&#x434;&#x435;&#x43C; &#x43D;&#x430; &#x430;&#x434;&#x440;&#x435;&#x441; (IP &#x443;&#x43A;&#x430;&#x436;&#x438;&#x442;&#x435; &#x441;&#x432;&#x43E;&#x439;) http://192.168.0.72/hot/0/0/0.png
# &#x415;&#x441;&#x43B;&#x438; &#x442;&#x430;&#x439;&#x43B; &#x43F;&#x43E;&#x44F;&#x432;&#x438;&#x43B;&#x441;&#x44F; - &#x442;&#x43E; &#x432;&#x441;&#x435; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E;. &#x416;&#x43C;&#x438;&#x442;&#x435; CTRL+C &#x434;&#x43B;&#x44F; &#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x430; &#x440;&#x435;&#x43D;&#x434;&#x440;&#x435;&#x440;&#x435;&#x440;&#x430;.

# &#x41F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B; ~/src/mod_tile/debian/renderd.init
    RUNASUSER=alexander

sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd
sudo cp ~/src/mod_tile/debian/renderd.service /lib/systemd/system/

# &#x41F;&#x440;&#x43E;&#x431;&#x443;&#x435;&#x43C; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; renderd
sudo /etc/init.d/renderd start

# &#x421;&#x442;&#x430;&#x432;&#x438;&#x43C; &#x432; &#x430;&#x432;&#x442;&#x43E;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;
sudo systemctl enable renderd</code></pre><p>&#x41F;&#x43E;&#x434;&#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43A;&#x430; HTML-&#x444;&#x430;&#x439;&#x43B;&#x430; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x430; &#x442;&#x430;&#x439;&#x43B;&#x43E;&#x432;</p><pre><code># &#x417;&#x430;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x43D;&#x430; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x443; &#x441; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x43E;&#x43C; &#x444;&#x430;&#x439;&#x43B; ~/src/mod_tile/extra/sample_leaflet.html
# &#x41C;&#x435;&#x43D;&#x44F;&#x435;&#x43C; &#x432; &#x43D;&#x435;&#x43C; &#x430;&#x434;&#x440;&#x435;&#x441; 127.0.0.1 &#x43D;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x439; &#x438; &#x43E;&#x442;&#x43A;&#x440;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x435;&#x43D;&#x43D;&#x44B;&#x439; HTML-&#x444;&#x430;&#x439;&#x43B; &#x432; &#x431;&#x440;&#x430;&#x443;&#x437;&#x435;&#x440;&#x435;</code></pre><h2 id="-1-osm">&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; 1. &#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x438;&#x43B;&#x438; &#x434;&#x443;&#x431;&#x43B;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; OSM</h2><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x443;&#x44E; &#x431;&#x430;&#x437;&#x443; &#x441; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x442;&#x438;&#x43F;&#x430; osmcarto_gis20181205 &#x43F;&#x43E; &#x438;&#x43D;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x446;&#x438;&#x438; &#xA0;&#x432;&#x44B;&#x448;&#x435;. &#x418;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x443;&#x434;&#x430; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x434;&#x430;&#x43C;&#x43F;. &#x421;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x441;&#x442;&#x438;&#x43B;&#x44F; &#x432; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x435; &#xA0;&#x43C;&#x435;&#x441;&#x442;&#x43E;, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; &#x432;</p><pre><code>/home/alexander/src/openstreetmap-carto-new/</code></pre><p>&#x421;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x432;&#x43B;&#x430;&#x434;&#x435;&#x43B;&#x44C;&#x446;&#x430; &#x43D;&#x43E;&#x432;&#x43E;&#x439; &#x43F;&#x430;&#x43F;&#x43A;&#x438; &#x43D;&#x430; alexander:</p><pre><code>sudo chown alexander /home/alexander/src/openstreetmap-carto-new/</code></pre><p>&#x418;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x438;&#x43C;&#x44F; &#x431;&#x430;&#x437;&#x44B; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x444;&#x430;&#x439;&#x43B;&#x435; project.mml:</p><pre><code>    dbname: &quot;osmcarto_gis20181205&quot;</code></pre><p>&#x413;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x444;&#x430;&#x439;&#x43B;&#x430; &#x441;&#x442;&#x438;&#x43B;&#x44F; Mapnik:</p><pre><code>cd /home/alexander/src/openstreetmap-carto-new/
sudo rm mapnik.xml
carto project.mml&gt; mapnik.xml</code></pre><p>&#x418;&#x441;&#x43F;&#x440;&#x430;&#x432;&#x438;&#x442;&#x44C; /usr/local/etc/renderd.conf. &#x414;&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x442;&#x44C; &#x432; &#x43D;&#x435;&#x433;&#x43E; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x431;&#x43B;&#x43E;&#x43A;:</p><pre><code>    [ajt2]
    URI=/hot2/
    TILEDIR=/var/lib/mod_tile
    XML=/home/alexander/src/openstreetmap-carto-new/mapnik.xml
    HOST=localhost
    TILESIZE=256
    MAXZOOM=20</code></pre><p>&#x41F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x43E;&#x432;</p><pre><code>sudo service apache2 restart
sudo service renderd restart</code></pre><p>&#x41A;&#x43E;&#x43F;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x444;&#x430;&#x439;&#x43B; sample_leaflet.html &gt; sample_leaflet2.html. &#x417;&#x430;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x432; &#x43D;&#x435;&#x43C; URL &#x43D;&#x430; &#x442;&#x430;&#x43A;&#x43E;&#x439;:</p><pre><code>http://192.168.0.72/hot2/{z}/{x}/{y}.png</code></pre><h2 id="-2-kosmtik">&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; 2. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440; &#x441;&#x442;&#x438;&#x43B;&#x435;&#x439; kosmtik</h2><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;: <br><a href="https://github.com/kosmtik/kosmtik" rel="nofollow noopener">https://github.com/kosmtik/kosmtik</a> <br> &#x415;&#x449;&#x435; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x435;&#x441;&#x43D;&#x430;&#x44F; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x430;: <a href="https://ircama.github.io/osm-carto-tutorials/kosmtik-ubuntu-setup/" rel="nofollow noopener">https://ircama.github.io/osm-carto-tutorials/kosmtik-ubuntu-setup/</a> <br> &#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; CartoCSS:<a href="http://https://media.readthedocs.org/pdf/cartocss/latest/cartocss.pdf" rel="nofollow noopener"> https://media.readthedocs.org/pdf/cartocss/latest/cartocss.pdf</a></p><p>&#x420;&#x435;&#x437;&#x435;&#x440;&#x432;&#x43D;&#x430;&#x44F; &#x43A;&#x43E;&#x43F;&#x438;&#x44F; &#x441;&#x442;&#x438;&#x43B;&#x44F;. <br>&#x421;&#x442;&#x438;&#x43B;&#x44C; (/home/alexander/src/openstreetmap-carto) &#xA0;&#x43F;&#x440;&#x435;&#x434;&#x432;&#x430;&#x440;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x441;&#x43A;&#x43E;&#x43F;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D; &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#xA0;(/home/alexander/src/openstreetmap-carto-new)</p><pre><code>cp -r /home/alexander/src/openstreetmap-carto/ /home/alexander/src/openstreetmap-carto-new/
sudo npm -g install kosmtik

# &#x41E;&#x442;&#x43A;&#x440;&#x44B;&#x442;&#x438;&#x435; &#x43F;&#x43E;&#x440;&#x442;&#x430; &#x43D;&#x430; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x435; 192.168.0.72
kosmtik serve /home/alexander/src/openstreetmap-carto-new/project.mml --host 192.168.0.72

# &#x41F;&#x440;&#x43E;&#x445;&#x43E;&#x434;&#x438;&#x43C; &#x43D;&#x430; URL: http://192.168.0.72:6789/
# &#x412;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43C; &#x444;&#x430;&#x439;&#x43B;&#x44B; *.mss &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x435; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;. &#x41F;&#x440;&#x438; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x438; &#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432; &#x431;&#x443;&#x434;&#x435;&#x442; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x442;&#x44C;&#x441;&#x44F; mapnik &#x432; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x435; kosmtik &#x438; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x442;&#x430;&#x439;&#x43B;&#x44B; &#x432; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440;&#x435;.</code></pre><h2 id="-3-osm-bright">&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; 3. &#x418;&#x43C;&#x43F;&#x43E;&#x440;&#x442; &#x441;&#x442;&#x438;&#x43B;&#x44F; OSM Bright</h2><p>&#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;&#x438;:<br> <a href="https://github.com/mapbox/osm-bright" rel="nofollow noopener">https://github.com/mapbox/osm-bright</a><br> <a href="https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/" rel="nofollow noopener">https://switch2osm.org/serving-tiles/manually-building-a-tile-server-14-04/</a><br> <a href="https://github.com/mapbox/osm-bright/blob/master/README.md" rel="nofollow noopener">https://github.com/mapbox/osm-bright/blob/master/README.md</a><br> &#x41F;&#x43E; &#x43F;&#x43E;&#x432;&#x43E;&#x434;&#x443; &#x437;&#x430;&#x43C;&#x435;&#x43D;&#x44B; &#x432; &#x444;&#x430;&#x439;&#x43B;&#x435; osm-bright.osm2pgsql.mml &#x441;&#x441;&#x44B;&#x43B;&#x43E;&#x43A; URL &#x43D;&#x430; &#x443;&#x436;&#x435; &#x441;&#x43A;&#x430;&#x447;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x438; &#x440;&#x430;&#x441;&#x43F;&#x430;&#x43A;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x430;&#x440;&#x445;&#x438;&#x432;&#x44B;:<br> <a href="https://switch2osm.org/?s=loading+osm+data" rel="nofollow noopener">https://switch2osm.org/?s=loading+osm+data</a></p><p>&#x41F;&#x43E;&#x434; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x435;&#x43C; postgres &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x431;&#x430;&#x437;&#x443; <strong>osmbright_svo_20181210</strong></p><pre><code>sudo -u postgres -i
createdb -E UTF8 -O alexander osmbright_svo_20181210

psql
    \c osmbright_svo_20181210
    CREATE EXTENSION postgis;
    CREATE EXTENSION hstore;
    ALTER TABLE geometry_columns OWNER TO alexander;
    ALTER TABLE spatial_ref_sys OWNER TO alexander;
    \q
    exit</code></pre><p>&#x417;&#x430;&#x433;&#x440;&#x443;&#x437;&#x43A;&#x430; &#x440;&#x435;&#x43F;&#x43E;&#x437;&#x438;&#x442;&#x43E;&#x440;&#x438;&#x44F; &#x441;&#x442;&#x438;&#x43B;&#x44F; &#x438; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x43D;&#x438;&#x437;&#x43A;&#x43E;&#x433;&#x43E; &#x437;&#x443;&#x43C;&#x430;</p><pre><code>cd ~/src
git clone git://github.com/mapbox/osm-bright.git
cd osm-bright
mkdir shp
cd shp
wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip
wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip

# &#x420;&#x430;&#x441;&#x43F;&#x430;&#x43A;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x430;&#x440;&#x445;&#x438;&#x432;&#x44B; &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x438; &#x441; &#x438;&#x445; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x44F;&#x43C;&#x438; (&#x431;&#x435;&#x437; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x43F;&#x430;&#x43F;&#x43E;&#x43A;)</code></pre><p>&#x418;&#x43C;&#x43F;&#x43E;&#x440;&#x442; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x411;&#x414;</p><pre><code>osm2pgsql -c -G -U alexander -W --number-processes 4 -d osmbright_svo_20181210 /home/alexander/data/RU-SVE.pbf
# &#x414;&#x440;&#x443;&#x433;&#x430;&#x44F; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44F; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x435;&#x440;&#x430; &#x43D;&#x430; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430; &#x420;&#x43E;&#x441;&#x441;&#x438;&#x438;:
# osm2pgsql --create --cache 3072 --slim --multi-geometry --username alexander --password --number-processes 4 --database osmbright_russia_2018-12-05 /home/alexander/data/russia-181205.osm.pbf
# &#x422;&#x430;&#x43A;&#x43E;&#x439; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442; &#x437;&#x430;&#x43D;&#x44F;&#x43B; 31027 &#x441;&#x435;&#x43A;&#x443;&#x43D;&#x434; &#x434;&#x43B;&#x44F; &#x420;&#x43E;&#x441;&#x441;&#x438;&#x438; &#x43D;&#x430; SSD VirtualBox (MaxWriteSpeed=120Mb/s)
# &#x417;&#x434;&#x435;&#x441;&#x44C; &#x432;&#x430;&#x436;&#x435;&#x43D; &#x43A;&#x43B;&#x44E;&#x447; --cache 3072 :
# - &#x43E;&#x43D; &#x432;&#x44B;&#x434;&#x435;&#x43B;&#x44F;&#x435;&#x442; 3 &#x413;&#x431; &#x41E;&#x417;&#x423; &#x434;&#x43B;&#x44F; &#x43A;&#x44D;&#x448;&#x430; &#x43D;&#x43E;&#x434;&#x43E;&#x432; &#x43F;&#x440;&#x438; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x435; - &#x437;&#x43D;&#x430;&#x447;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E; &#x443;&#x441;&#x43A;&#x43E;&#x440;&#x44F;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441; &#x438;&#x43C;&#x43F;&#x43E;&#x440;&#x442;&#x430;
# - &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x434;&#x430;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x430; &#x43A;&#x44D;&#x448; &#x43C;&#x430;&#x43A;&#x441;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x435; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x438;&#x437; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x43E;&#x439; (80-90%)</code></pre><p>&#x41A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x438;&#x43B;&#x44F;</p><pre><code>cd /home/alexander/src/osm-bright/
cp configure.py.sample configure.py

# &#x41F;&#x440;&#x438;&#x432;&#x435;&#x434;&#x435;&#x43C; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; (/home/alexander/src/osm-bright/configure.py) &#x43A; &#x432;&#x438;&#x434;&#x443;:
    config[&quot;name&quot;] = &quot;OSM Bright SvObl&quot;
    config[&quot;importer&quot;] = &quot;osm2pgsql&quot;
    config[&quot;path&quot;] = path.expanduser(&quot;/home/alexander/src/osm-bright&quot;)
    config[&quot;postgis&quot;][&quot;host&quot;]     = &quot;127.0.0.1&quot;
    config[&quot;postgis&quot;][&quot;port&quot;]     = &quot;5432&quot;
    config[&quot;postgis&quot;][&quot;dbname&quot;]   = &quot;osmbright_svo_20181210&quot;
    config[&quot;postgis&quot;][&quot;user&quot;]     = &quot;alexander&quot;
    config[&quot;postgis&quot;][&quot;password&quot;] = &quot;1&quot;

./make.py
cd OSMBrightSvObl
carto project.mml&gt; mapnik.xml</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x431;&#x43B;&#x43E;&#x43A; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x435;&#x440;&#x430;</p><pre><code>#  &#x412; &#x444;&#x430;&#x439;&#x43B;&#x435; /usr/local/etc/renderd.conf:
    [ajt3]
    URI=/hot3/
    TILEDIR=/var/lib/mod_tile
    XML=/home/alexander/src/osm-bright/OSMBrightSvObl/mapnik.xml
    HOST=localhost
    TILESIZE=256
    MAXZOOM=20</code></pre><p>&#x41E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;&#x430; renderd, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432;&#x440;&#x443;&#x447;&#x43D;&#x443;&#x44E;&#x2026;</p><pre><code>sudo service apache2 restart
sudo service renderd stop
renderd -f -c /usr/local/etc/renderd.conf

# &#x414;&#x435;&#x43B;&#x430;&#x435;&#x43C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; HTML-&#x444;&#x430;&#x439;&#x43B;, &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x44F;&#x435;&#x43C;, &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x44F;&#x442;&#x441;&#x44F; &#x43B;&#x438; &#x442;&#x430;&#x439;&#x43B;&#x44B; &#x43F;&#x440;&#x438; &#x440;&#x443;&#x447;&#x43D;&#x43E;&#x43C; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x435; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x435;&#x440;&#x430;.
# &#x415;&#x441;&#x43B;&#x438; &#x432;&#x441;&#x435; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x43E; - &#x442;&#x43E; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430;&#x435;&#x43C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441;:
sudo service renderd start</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x43D;&#x443;&#x436;&#x43D;&#x43E; &#x440;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x438;&#x43B;&#x44C;:</p><pre><code># &#x420;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440; &#x434;&#x43B;&#x44F; OSM-Bright
kosmtik serve /home/alexander/src/osm-bright/OSMBrightSvObl/project.mml --host 192.168.0.72</code></pre><h2 id="-4-">&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; 4. &#x41F;&#x440;&#x435;-&#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433; &#x442;&#x430;&#x439;&#x43B;&#x43E;&#x432; &#x43F;&#x43E; &#x441;&#x43B;&#x43E;&#x44F;&#x43C;</h2><p>&#x41D;&#x430;&#x431;&#x43B;&#x44E;&#x434;&#x430;&#x442;&#x44C; &#x437;&#x430; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x43E;&#x43C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x442;&#x430;&#x43A;:</p><pre><code>tail -F /var/log/syslog</code></pre><p>&#x424;&#x430;&#x439;&#x43B;&#x44B; &#x441;&#x447;&#x438;&#x442;&#x430;&#x43B; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x43D;&#x43E;&#x439; ncdu.<br>&#x417;&#x430;&#x43F;&#x443;&#x441;&#x43A; &#x43F;&#x440;&#x435;-&#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433;&#x430; &#x434;&#x43B;&#x44F; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x441;&#x43B;&#x43E;&#x435;&#x432; &#x43F;&#x43E; &#x432;&#x441;&#x435;&#x439; &#x43F;&#x43B;&#x430;&#x43D;&#x435;&#x442;&#x435;:</p><pre><code>time render_list -a -n 3 -s /var/run/renderd/renderd.sock -z 11 -Z 11 -m osmbright_scale2_russia
# time - &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E; &#x442;&#x430;&#x439;&#x43C;&#x435;&#x440; &#x434;&#x43B;&#x44F; &#x432;&#x44B;&#x447;&#x438;&#x441;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x43E;&#x442;&#x440;&#x430;&#x447;&#x435;&#x43D;&#x43D;&#x43E;&#x433;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438;
# -n - &#x447;&#x438;&#x441;&#x43B;&#x43E; &#x43F;&#x43E;&#x442;&#x43E;&#x43A;&#x43E;&#x432; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x438; &#x437;&#x430;&#x434;&#x430;&#x43D;&#x438;&#x439; &#x43D;&#x430; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433;
# -z -Z - &#x43C;&#x438;&#x43D;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x438; &#x43C;&#x430;&#x43A;&#x441;&#x438;&#x43C;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x443;&#x440;&#x43E;&#x432;&#x435;&#x43D;&#x44C; &#x437;&#x443;&#x43C;&#x430; &#x434;&#x43B;&#x44F; &#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433;&#x430;
# -m - &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x431;&#x43B;&#x43E;&#x43A;&#x430; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;&#x43E;&#x432; &#x432; &#x444;&#x430;&#x439;&#x43B;&#x435; /usr/local/etc/renderd.conf (&#x432; &#x43A;&#x432;&#x430;&#x434;&#x440;&#x430;&#x442;&#x43D;&#x44B;&#x445; &#x441;&#x43A;&#x43E;&#x431;&#x43A;&#x430;&#x445;)</code></pre><p>&#x414;&#x43B;&#x44F; &#x43F;&#x440;&#x435;-&#x440;&#x435;&#x43D;&#x434;&#x435;&#x440;&#x438;&#x43D;&#x433;&#x430; &#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x445; &#x437;&#x43E;&#x43D; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x442;&#x430;&#x43A;&#x443;&#x44E; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x443;-&#x43F;&#x440;&#x43E;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x443; &#x434;&#x43B;&#x44F; render_list</p><pre><code># &#x418;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A;: https://github.com/alx77/render_list_geo.pl
# &#x41D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x421;&#x432;&#x435;&#x440;&#x434;&#x43B;&#x43E;&#x432;&#x441;&#x43A;&#x430;&#x44F; &#x43E;&#x431;&#x43B;&#x430;&#x441;&#x442;&#x44C; &#x434;&#x430;&#x441;&#x442; &#x442;&#x430;&#x43A;&#x438;&#x435; &#x43A;&#x43E;&#x43E;&#x440;&#x434;&#x438;&#x43D;&#x430;&#x442;&#x44B; (LAT,LON):
# 62.2, 56.9                        62.2, 66.3
# 55.7, 56.9                        55.7, 66.3

# &#x41A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x430;:
time ./render_list_geo.pl -n 3 -z 0 -Z 16 -x 56.9 -X 66.3 -y 55.7 -Y 62.2 -m osmbright_scale2_russia</code></pre><h2 id="-5-osm-bright-">&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x438;&#x435; 5. &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x430; &#x441;&#x43B;&#x43E;&#x439; OSM-Bright &#x43D;&#x43E;&#x43C;&#x435;&#x440;&#x43E;&#x432; &#x434;&#x43E;&#x43C;&#x43E;&#x432;</h2><p>&#x41D;&#x443;&#x436;&#x43D;&#x43E; &#x443;&#x436;&#x435; &#x438;&#x43C;&#x435;&#x442;&#x44C; &#x441;&#x43E;&#x431;&#x440;&#x430;&#x43D;&#x43D;&#x443;&#x44E; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x441;&#x442;&#x438;&#x43B;&#x44F; (&#x43E;&#x43D;&#x430; &#x43F;&#x43E;&#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;&#x430; <strong>./make.py</strong>). &#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x444;&#x430;&#x439;&#x43B; <strong>addressing.mss:</strong></p><pre><code>/* Features related to (postal) adresses: */
@address-color: #666;

@water-color: #aad3df;
@land-color: #f2efe9;
@standard-halo-radius: 1;
@standard-halo-fill: rgba(255,255,255,0.6);

#interpolation {
  [zoom&gt;= 17] {
    line-color: @address-color;
    line-width: 1;
    line-dasharray: 2,4;
  }
}

#addresses {

  [zoom&gt;= 17] {
    text-name: &quot;[addr_housename]&quot;;
    [&quot;addr_housenumber&quot; != null] {
      text-name: [addr_housenumber];
      [&quot;addr_housename&quot; != null] {
        text-name: [addr_housenumber] + &quot;\n&quot; + [addr_housename];
      }
    }
    text-placement: interior;
    //text-face-name: @book-fonts;
    text-face-name: @sans;
    text-fill: @address-color;
    text-halo-radius: @standard-halo-radius;
    text-halo-fill: @standard-halo-fill;
    text-size: 15;
    text-wrap-width: 30; // 3.0 em
    text-line-spacing: -1.5; // -0.15 em
    text-margin: 3; // 0.3 em

    [zoom&gt;= 18] {
      text-halo-radius: @standard-halo-radius * 1.25;
      text-size: 18;
    }

    [zoom&gt;= 20] {
        text-size: 20;
        text-wrap-width: 22; // 2.0 em
        text-line-spacing: -1.65; // -0.15 em
        text-margin: 3.3; // 0.3 em
    }
  }
}</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x432; &#x444;&#x430;&#x439;&#x43B; project.mml &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F;:</p><pre><code># &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x443; &#x43D;&#x430; addressing.mss, &#x434;&#x43E;&#x43B;&#x436;&#x43D;&#x43E; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x442;&#x430;&#x43A;:

  &quot;Stylesheet&quot;: [
    &quot;palette.mss&quot;,
    &quot;base.mss&quot;,
    &quot;roads.mss&quot;,
    &quot;labels.mss&quot;,
    &quot;addressing.mss&quot;
  ],

# &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x438;&#x441;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x43A; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x43B;&#x44F; &#x441;&#x43B;&#x43E;&#x44F; addresses, &#x441;&#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x44F; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A; &#x411;&#x414;,
# &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; &#x432;&#x43E;&#x442; &#x442;&#x430;&#x43A;:

    {
      &quot;Datasource&quot;: {
        &quot;dbname&quot;: &quot;osmbright_russia_2018-12-05&quot;,
        &quot;extent&quot;: &quot;-20037508.34,-20037508.34,20037508.34,20037508.34&quot;,
        &quot;geometry_field&quot;: &quot;way&quot;,
        &quot;host&quot;: &quot;127.0.0.1&quot;,
        &quot;id&quot;: &quot;addresses&quot;,
        &quot;key_field&quot;: &quot;&quot;,
        &quot;password&quot;: &quot;1&quot;,
        &quot;port&quot;: &quot;5432&quot;,
        &quot;project&quot;: &quot;foss4g-2011&quot;,
        &quot;srs&quot;: &quot;+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over&quot;,
        &quot;table&quot;: &quot;(SELECT
            way,
            \&quot;addr:housenumber\&quot; AS addr_housenumber,
            \&quot;addr:housename\&quot; AS addr_housename,

            way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels
          FROM planet_osm_polygon
          WHERE ((\&quot;addr:housenumber\&quot; IS NOT NULL) OR (\&quot;addr:housename\&quot; IS NOT NULL) )
            AND building IS NOT NULL
        UNION ALL
        SELECT
            way,
            \&quot;addr:housenumber\&quot; AS addr_housenumber,
            \&quot;addr:housename\&quot; AS addr_housename,
            NULL AS way_pixels
          FROM planet_osm_point
          WHERE (\&quot;addr:housenumber\&quot; IS NOT NULL) OR (\&quot;addr:housename\&quot; IS NOT NULL)
          ORDER BY way_pixels DESC NULLS LAST) AS DATA \n&quot;,
        &quot;type&quot;: &quot;postgis&quot;,
        &quot;user&quot;: &quot;alexander&quot;
      },
      &quot;advanced&quot;: {},
      &quot;class&quot;: &quot;&quot;,
      &quot;extent&quot;: [
        -122.85990918289764,
        47.38001179491598,
        -121.86970418303555,
        47.842970094896586
      ],
      &quot;geometry&quot;: &quot;point&quot;,
      &quot;id&quot;: &quot;addresses&quot;,
      &quot;name&quot;: &quot;addresses&quot;,
      &quot;srs&quot;: &quot;+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over&quot;,
      &quot;srs-name&quot;: &quot;900913&quot;
    }</code></pre><p>&#x421;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x44B;&#x439; &#x441;&#x442;&#x438;&#x43B;&#x44C; &#x434;&#x43B;&#x44F; Mapnik</p><pre><code>carto project.mml&gt; mapnik.xml</code></pre><h2 id="--2">&#x422;&#x440;&#x438;&#x43A;&#x438;</h2><p>&#x415;&#x441;&#x43B;&#x438; &#x431;&#x443;&#x434;&#x443;&#x442; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x44B; &#x441; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43A; &#x431;&#x430;&#x437;&#x435;, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x433;&#x43E;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;:</p><pre><code># &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x441;&#x442;&#x440;&#x43E;&#x447;&#x43A;&#x443; &#x432; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433; /etc/postgresql/10/main/pg_hba.conf:
    host&lt;--&gt;all&lt;---&gt;&lt;------&gt;all&lt;---&gt;&lt;------&gt;192.168.0.0/24&lt;&gt;&lt;------&gt;md5

# &#x414;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43B; &#x441;&#x442;&#x440;&#x43E;&#x447;&#x43A;&#x443; &#x432; /etc/postgresql/10/main/postgresql.conf
    listen_addresses = &apos;*&apos;</code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x437;&#x430;&#x431;&#x44B;&#x43B;&#x438; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x44C; &#x43F;&#x430;&#x440;&#x43E;&#x43B;&#x44C; &#x43F;&#x440;&#x438; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x438; &#x443;&#x447;&#x435;&#x442;&#x43A;&#x438; postgres, &#x442;&#x43E; &#x432;&#x43E;&#x442;:</p><pre><code>sudo -u postgres psql
    ALTER USER alexander PASSWORD &apos;1&apos;;
    \q
   </code></pre><p>&#x415;&#x441;&#x43B;&#x438; &#x443;&#x441;&#x442;&#x430;&#x43B; &#x436;&#x434;&#x430;&#x442;&#x44C;, &#x43F;&#x43E;&#x43A;&#x430; &#x437;&#x430;&#x43F;&#x430;&#x440;&#x441;&#x438;&#x442;&#x441;&#x44F; &#x434;&#x430;&#x43C;&#x43F; PBF &#x432; &#x431;&#x430;&#x437;&#x443; Pgsql, &#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#xA0;&#x43F;&#x440;&#x438;&#x43A;&#x438;&#x43D;&#x443;&#x442;&#x44C;, &#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43E;&#x441;&#x442;&#x430;&#x43B;&#x43E;&#x441;&#x44C; &#x436;&#x434;&#x430;&#x442;&#x44C;, &#x43D;&#x430;&#x442;&#x440;&#x430;&#x432;&#x438;&#x432; &#x43D;&#x430; &#x434;&#x430;&#x43C;&#x43F; PBF &#x442;&#x430;&#x43A;&#x443;&#x44E; &#x443;&#x442;&#x438;&#x43B;&#x438;&#x442;&#x443;:</p><pre><code># &#x412;&#x437;&#x44F;&#x442;&#x43E; &#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430;: https://gis.stackexchange.com/questions/238009/get-the-date-information-of-a-pbf-file
# https://wiki.openstreetmap.org/wiki/Osmconvert
osmconvert64-0.8.8p.exe l:\opt\_osm-dumps\0.4.0\2018-12-05\russia-181205.osm.pbf --out-statistics
&#x41E;&#x43D;&#x430; &#x432;&#x44B;&#x432;&#x435;&#x434;&#x435;&#x442; &#x43E;&#x431;&#x44A;&#x435;&#x43C; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x432; &#x434;&#x430;&#x43C;&#x43F;&#x435; &#x43F;&#x43E; &#x442;&#x438;&#x43F;&#x430;&#x43C; Node/Way/Relation.
&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x438;&#x43A;&#x438;&#x43D;&#x443;&#x43B;&#x438; &#x43F;&#x43E; &#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x438;, &#x435;&#x449;&#x435; &#x443;&#x43C;&#x43D;&#x43E;&#x436;&#x44C;&#x442;&#x435; &#x43D;&#x430; 2 &#x438;&#x43B;&#x438; 3, &#x442;.&#x43A;. &#x431;&#x443;&#x434;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x430; &#x438;&#x43D;&#x434;&#x435;&#x43A;&#x441;&#x430;&#x446;&#x438;&#x44F; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445;.</code></pre><p>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43D;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x430;&#x44E;&#x449;&#x438;&#x445; &#x448;&#x440;&#x438;&#x444;&#x442;&#x43E;&#x432;</p><pre><code>https://askubuntu.com/questions/3697/how-do-i-install-fonts
http://tile.paulnorman.ca/fonts/Malige-n.ttf
https://www.dafontfree.net/freefonts-unifont-f165343.htm
https://github.com/saiswa/free-fonts/tree/master/PCLinuxOSFonts

# &#x421;&#x43A;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x448;&#x440;&#x438;&#x444;&#x442; TTF (&#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, ArundinaSans.ttf), &#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x438;&#x442;&#x44C; &#x435;&#x433;&#x43E; &#x432; &#x43F;&#x430;&#x43F;&#x43A;&#x443; /usr/share/fonts/truetype
# &#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43A;&#x44D;&#x448; &#x448;&#x440;&#x438;&#x444;&#x442;&#x43E;&#x432;:
fc-cache -f -v
# &#x423;&#x431;&#x435;&#x434;&#x438;&#x442;&#x44C;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x448;&#x440;&#x438;&#x444;&#x442; &#x43F;&#x43E;&#x434;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;:
fc-list | grep Arund</code></pre><p>&#x414;&#x43B;&#x44F; &#x432;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x440;&#x435;&#x436;&#x438;&#x43C;&#x430; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x442;&#x435;&#x43A;&#x441;&#x442;&#x430; &#x432; &#x442;&#x430;&#x439;&#x43B;&#x430;&#x445;</p><pre><code>&#x412; &#x444;&#x430;&#x439;&#x43B;&#x435; /usr/local/etc/renderd.conf &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x432; &#x43D;&#x443;&#x436;&#x43D;&#x443;&#x44E; &#x441;&#x435;&#x43A;&#x446;&#x438;&#x44E; &#x43F;&#x430;&#x440;&#x430;&#x43C;&#x435;&#x442;&#x440;:
SCALE=2</code></pre><p>&#x414;&#x43B;&#x44F; &#x43E;&#x442;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438; &#x442;&#x430;&#x439;&#x43B;&#x43E;&#x432; (&#x441;&#x43B;&#x435;&#x434;&#x443;&#x435;&#x442; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;)</p><pre><code># &#x412;&#x437;&#x44F;&#x442;&#x43E; &#x43E;&#x442;&#x441;&#x44E;&#x434;&#x430;: https://forum.openstreetmap.org/viewtopic.php?id=52795
# &#x412; &#x444;&#x430;&#x439;&#x43B;&#x435;
#    /etc/apache2/sites-enabled/000-default.conf
#    &#x432; &#x431;&#x43B;&#x43E;&#x43A;&#x435; &lt;VirtualHost *:80&gt; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x43E;&#x43A;&#x443;:
#        ModTileBulkMode On
# &#x438; &#x43F;&#x435;&#x440;&#x435;&#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x432;&#x438;&#x441; &#x430;&#x43F;&#x430;&#x447;&#x430;</code></pre><p>&#x414;&#x43B;&#x44F; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; swap &#x43D;&#x430; Ubuntu 1804 (&#x435;&#x441;&#x43B;&#x438; &#x43F;&#x430;&#x43C;&#x44F;&#x442;&#x438; &#x432;&#x441;&#x435;-&#x442;&#x430;&#x43A;&#x438; &#x43D;&#x435; &#x445;&#x432;&#x430;&#x442;&#x438;&#x43B;&#x43E;)</p><pre><code>Swap &#x432; Ubuntu 1804 &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D; &#x432; &#x432;&#x438;&#x434;&#x435; &#x444;&#x430;&#x439;&#x43B;&#x430;, &#x43D;&#x435; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x435;&#x440;&#x435;&#x440;&#x430;&#x437;&#x43C;&#x435;&#x442;&#x43A;&#x430; &#x440;&#x430;&#x437;&#x434;&#x435;&#x43B;&#x43E;&#x432; &#x434;&#x438;&#x441;&#x43A;&#x430;.
https://askubuntu.com/questions/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04</code></pre>]]></content:encoded></item></channel></rss>