<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - Loafer</title>
		<link>https://www.cyberforum.ru/blogs/899942/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Wed, 02 Sep 2026 10:58:46 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - Loafer</title>
			<link>https://www.cyberforum.ru/blogs/899942/</link>
		</image>
		<item>
			<title>Настройки VS Code</title>
			<link>https://www.cyberforum.ru/blogs/899942/10869.html</link>
			<pubDate>Mon, 13 Apr 2026 16:18:39 GMT</pubDate>
			<description><![CDATA[{ 
    "cmake.configureOnOpen": false, 
    "diffEditor.ignoreTrimWhitespace": true, 
   ...]]></description>
			<content:encoded><![CDATA[<div><div class="codeblock"><table class="json"><thead><tr><td colspan="2" id="553072619"  class="head">JSON</td></tr></thead><tbody><tr class="li1"><td><div id="553072619" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="de1"><pre class="de1"><span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="st0">&quot;cmake.configureOnOpen&quot;</span><span class="sy0">:</span> <span class="kw2">false</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;diffEditor.ignoreTrimWhitespace&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;editor.guides.bracketPairs&quot;</span><span class="sy0">:</span> <span class="st0">&quot;active&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;extensions.ignoreRecommendations&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;files.trimTrailingWhitespace&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;git.blame.editorDecoration.enabled&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;git.confirmSync&quot;</span><span class="sy0">:</span> <span class="kw2">false</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;git.inputValidation&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;git.openRepositoryInParentFolders&quot;</span><span class="sy0">:</span> <span class="st0">&quot;never&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;peacock.showColorInStatusBar&quot;</span><span class="sy0">:</span> <span class="kw2">false</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;remote.SSH.localServerDownload&quot;</span><span class="sy0">:</span> <span class="st0">&quot;always&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;security.workspace.trust.untrustedFiles&quot;</span><span class="sy0">:</span> <span class="st0">&quot;open&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;workbench.list.openMode&quot;</span><span class="sy0">:</span> <span class="st0">&quot;doubleClick&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;workbench.sideBar.location&quot;</span><span class="sy0">:</span> <span class="st0">&quot;right&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;workbench.startupEditor&quot;</span><span class="sy0">:</span> <span class="st0">&quot;none&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;workbench.tree.expandMode&quot;</span><span class="sy0">:</span> <span class="st0">&quot;doubleClick&quot;</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="st0">&quot;[python]&quot;</span><span class="sy0">:</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;diffEditor.ignoreTrimWhitespace&quot;</span><span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span>
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/10869.html</guid>
		</item>
		<item>
			<title>Шпаргалка по WSL</title>
			<link>https://www.cyberforum.ru/blogs/899942/10527.html</link>
			<pubDate>Fri, 08 Aug 2025 19:39:01 GMT</pubDate>
			<description>Обнаружил в WSL (https://ru.wikipedia.org/wiki/Windows_Subsystem_for_Linux) два очень не приятных...</description>
			<content:encoded><![CDATA[<div>Обнаружил в <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/Windows_Subsystem_for_Linux" target="_blank" title="https://ru.wikipedia.org/wiki/Windows_Subsystem_for_Linux">WSL</a> два очень не приятных момента.<br />
<br />
Оказалось, что WSL периодически падает и генерирует <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BC%D0%BF_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%94%D0%B0%D0%BC%D0%BF_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8">core dump</a>'ы, которые занимают крайне ощутимое количество памяти на диске. Чтобы отключить накопление этих файлов, надо в файле <code class="inlinecode">%USERPROFILE%\.wslconfig</code> прописать:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="754156861"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="754156861" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1"><span class="br0">&#91;</span>wsl2<span class="br0">&#93;</span>
MaxCrashDumpCount=-<span class="nu0">1</span></pre></td></tr></table></div></td></tr></tbody></table></div>Также оказалось, что WSL не уменьшает автоматически место, занимаемое WSL-дистрибутивом Linux. Если Linux'у требуется место, то оно берется из Windows системы, но обратно не работает. Место можно уменьшить вручную следующим набором команд (для Ubuntu):<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="838025688"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="838025688" style="height: 158px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
</pre></td><td class="de1"><pre class="de1">wsl --shutdown
diskpart
# open window Diskpart
select vdisk file=&quot;%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_*\LocalState\ext4.vhdx&quot;
attach vdisk readonly
compact vdisk
detach vdisk
exit</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/10527.html</guid>
		</item>
		<item>
			<title>Работа с ccache/sccache в рамках C++</title>
			<link>https://www.cyberforum.ru/blogs/899942/10411.html</link>
			<pubDate>Wed, 11 Jun 2025 09:00:23 GMT</pubDate>
			<description>Утилиты ccache (https://ccache.dev/) и sccache (https://github.com/mozilla/sccache) занимаются тем,...</description>
			<content:encoded><![CDATA[<div>Утилиты <a rel="nofollow noopener noreferrer" href="https://ccache.dev/" target="_blank" title="https://ccache.dev/">ccache</a> и <a rel="nofollow noopener noreferrer" href="https://github.com/mozilla/sccache" target="_blank" title="https://github.com/mozilla/sccache">sccache</a> занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться еще раз и в кеше будет обнаружен уже объект компиляции, то будет браться этот объект, вместо полноценной компиляции. Как работает само кеширование, например для <i>sccache</i>, можно посмотреть <a rel="nofollow noopener noreferrer" href="https://github.com/mozilla/sccache/blob/main/docs/Caching.md" target="_blank" title="https://github.com/mozilla/sccache/blob/main/docs/Caching.md">тут</a>.<br />
<br />
Алгоритм работы этих приложений можно отобразить картинкой:<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=10895&amp;d=1749628861" rel="Lightbox" id="attachment10895" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=10895&amp;thumb=1&amp;d=1749628861" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: Архитектура sccache.png
Просмотров: 624
Размер:	19.9 Кб
ID:	10895" style="margin: 5px" /></a><br />
Словами:<ul><li>если файл найден в кеше, то берется из кеша;</li>
<li>если файл в кеше не найден, то файл компилируется и сохраняется в кеше.</li>
</ul><br />
Надо понимать, что эти утилиты являются обертками над компиляторами (<i>gcc</i>/<i>clang</i>), поэтому они имеют два режима работы:<ol style="list-style-type: decimal"><li> запуск напрямую:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="275539566"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="275539566" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">ccache <span class="kw2">gcc</span> <span class="re5">-c</span> example.c</pre></td></tr></table></div></td></tr></tbody></table></div></li>
<li>выдать утилиту непосредственно за компилятор:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="696428333"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="696428333" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1"><span class="kw2">cp</span> ccache <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin<span class="sy0">/</span>
<span class="kw2">ln</span> <span class="re5">-s</span> ccache <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">gcc</span>
<span class="kw2">ln</span> <span class="re5">-s</span> ccache <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">g++</span>
<span class="kw2">gcc</span> <span class="re5">-c</span> example.c</pre></td></tr></table></div></td></tr></tbody></table></div></li>
</ol><br />
Рассмотрим частный случай, когда мы хотим воспользоваться первым режимом в утилите <i>CMake</i> (если мы уже выдали <i>ccache</i>/<i>sccache </i>за компилятор, то ничего делать не нужно). В данном случае, при конфигурировании <i>CMake</i>-проекта, нужно указать некоторые <i>CMake</i>-переменные:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="702961625"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="702961625" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">cmake <span class="re2">CMAKE_C_COMPILER_LAUNCHER</span>=sccache &nbsp;<span class="re2">CMAKE_CXX_COMPILER_LAUNCHER</span>=sccache ...</pre></td></tr></table></div></td></tr></tbody></table></div>Очень важной возможностью этих утилит является то, что кеш может располагаться не только на локальной машине, где непосредственно происходит компиляция, но и на удаленном хранилище. Таким образом это позволяет создать распределенный кеш и ускорить компиляцию одновременно на нескольких машинах.<br />
<br />
Если мы используем локальный кеш, то по умолчанию он хранится:<ul><li>для <i>ccache</i>: директория <code class="inlinecode">$HOME/.ccache</code></li>
<li>для <i>sccache</i>: директория <code class="inlinecode">$HOME/.cache/sccache</code></li>
</ul><br />
Если мы хотим использовать распределенный кеш, то сначала надо поднять сервер, где будет храниться кеш. Как пример, это может быть <a rel="nofollow noopener noreferrer" href="https://github.com/mozilla/sccache/blob/main/docs/Webdav.md" target="_blank" title="https://github.com/mozilla/sccache/blob/main/docs/Webdav.md">WebDAV</a>-сервер. Далее нужно:<ul><li>для <i>ccache</i>: указать переменную среды <code class="inlinecode">CCACHE_REMOTE_STORAGE</code>;</li>
<li>для <i>sccache</i>: указать переменную среды <code class="inlinecode">SCCACHE_WEBDAV_ENDPOINT </code>.</li>
</ul>В этих переменных среды должен быть прописан путь до сервера, например в формате <code class="inlinecode">http://&lt;ip-адрес&gt;:&lt;порт&gt;</code>.</div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/10411.html</guid>
		</item>
		<item>
			<title>Настройка MTProxy</title>
			<link>https://www.cyberforum.ru/blogs/899942/10402.html</link>
			<pubDate>Wed, 11 Jun 2025 07:55:47 GMT</pubDate>
			<description>Дополнительная информация к инструкции (https://github.com/TelegramMessenger/MTProxy) по настройке...</description>
			<content:encoded><![CDATA[<div>Дополнительная информация к <a rel="nofollow noopener noreferrer" href="https://github.com/TelegramMessenger/MTProxy" target="_blank" title="https://github.com/TelegramMessenger/MTProxy">инструкции</a> по настройке MTProxy:<ol style="list-style-type: decimal"><li>Перед сборкой проекта необходимо добавить флаг <code class="inlinecode">-fcommon</code> в конец переменной <code class="inlinecode">CFLAGS</code> в <code class="inlinecode">Makefile</code>.</li>
<li>Через <code class="inlinecode">crontab -e</code> добавить задачу:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="496358557"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="496358557" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="nu0">0</span> <span class="nu0">3</span> * * * curl -s https://core.telegram.org/getProxyConfig -o /root/.mtproxy/proxy-multi.conf</pre></td></tr></table></div></td></tr></tbody></table></div></li>
<li>Через <code class="inlinecode">crontab -e</code> добавить задачу:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="151124258"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="151124258" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="nu0">0</span> <span class="nu0">4</span> * * * systemctl restart MTProxy.service</pre></td></tr></table></div></td></tr></tbody></table></div></li>
</ol></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/10402.html</guid>
		</item>
		<item>
			<title>Crafting Interpreters</title>
			<link>https://www.cyberforum.ru/blogs/899942/8488.html</link>
			<pubDate>Sat, 30 Mar 2024 15:14:27 GMT</pubDate>
			<description>Прочитал наконец-то большую книгу по программированию за долгое время - Crafting Interpreters...</description>
			<content:encoded><![CDATA[<div>Прочитал наконец-то большую книгу по программированию за долгое время - <a rel="nofollow noopener noreferrer" href="https://craftinginterpreters.com/" target="_blank" title="https://craftinginterpreters.com/">Crafting Interpreters</a>. Если вкратце, то книга про то, как создаются языки программирования. По факту, в книге реализуется язык программирования, который автор назвал Lox, двумя способами - интерпретируемый язык на основе <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE">AST</a>, и управляемый язык на основе <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0">виртуальной машины</a>. Особенностью книги является то, что ЯП реализуется полностью с нуля, не прибегая ко всякого рода внешним утилитам, вроде <i>yacc </i>или <i>lex</i>. Она очень дружелюбна к новичкам в области построения ЯП, не пестрит каким-то большим количеством формул или сложной теории и написана очень хорошим и понятным языком. Книга требует вдумчивого многомесячного чтения.<br />
Некоторые основные вещи из книги:<ol style="list-style-type: decimal"><li>Повторил, какие бывают языки программирования: со статической или динамической типизацией, компилируемые или интерпретируемые, компилируемые в нативный машинный код или в байт-код виртуальной машины и т. д.</li>
<li>Узнал, что такое <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0_%D0%91%D1%8D%D0%BA%D1%83%D1%81%D0%B0_%E2%80%94_%D0%9D%D0%B0%D1%83%D1%80%D0%B0" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0_%D0%91%D1%8D%D0%BA%D1%83%D1%81%D0%B0_%E2%80%94_%D0%9D%D0%B0%D1%83%D1%80%D0%B0">BNF</a>. Теперь я хоть что-то буду понимать, когда буду видеть формальное описание ЯП.</li>
<li>Пайплайн работы компиляторов: такие части, как сканнер, парсер и собственно интерпретатор.</li>
<li>Внутреннее представление ЯП во время компиляции. Если говорить об интерпретаторе, как текст превращается в AST, а в случае управляемого языка, как текст превращается в байт-код виртуальной машины.</li>
<li>Алгоритмы для написания парсеров: метод рекурсивного спуска и алгоритм Пратта.</li>
<li>Оптимизация NaN boxing.</li>
<li>И многое другое.</li>
</ol></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/8488.html</guid>
		</item>
		<item>
			<title>Настройка NFS</title>
			<link>https://www.cyberforum.ru/blogs/899942/7505.html</link>
			<pubDate>Mon, 18 Apr 2022 16:51:14 GMT</pubDate>
			<description><![CDATA[Установка пакета: 
 
yum install nfs-utils 
Прописываем в файле /etc/nfs.conf: 
<div...]]></description>
			<content:encoded><![CDATA[<div>Установка пакета:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="176174010"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="176174010" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw2">yum install</span> nfs-utils</pre></td></tr></table></div></td></tr></tbody></table></div>Прописываем в файле <i>/etc/nfs.conf</i>:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="264386317"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="264386317" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1">vers2=n
vers3=y
vers4=n
vers4.0=n
vers4.1=n
vers4.2=n</pre></td></tr></table></div></td></tr></tbody></table></div>Прописываем в файле <i>/etc/exports</i>:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="685578235"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="685578235" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">/root/temp *<span class="br0">&#40;</span>ro,root_squash<span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Набираем следующие команды:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="442078218"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="442078218" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">exportfs <span class="re5">-a</span>
exportfs <span class="re5">-r</span>
systemctl restart nfs-server.service</pre></td></tr></table></div></td></tr></tbody></table></div>Смонтировать на стороне <i>Windows</i> каталог по <i>NFS</i>:<br />
<div class="codeblock"><table class="winbatch"><thead><tr><td colspan="2" id="397092324"  class="head">Windows Batch file</td></tr></thead><tbody><tr class="li1"><td><div id="397092324" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">mount <span class="co101">-o</span> anon \\<span class="st0">&quot;IP-адресс NFS-сервера&quot;</span>\root\temp I:</pre></td></tr></table></div></td></tr></tbody></table></div>Отмонтировать каталог:<br />
<div class="codeblock"><table class="winbatch"><thead><tr><td colspan="2" id="715344391"  class="head">Windows Batch file</td></tr></thead><tbody><tr class="li1"><td><div id="715344391" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">umount I:</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/7505.html</guid>
		</item>
		<item>
			<title>Шпаргалка по SNMP</title>
			<link>https://www.cyberforum.ru/blogs/899942/7251.html</link>
			<pubDate>Thu, 26 Aug 2021 15:50:43 GMT</pubDate>
			<description>*SNMP* - это такой сетевой протокол, предназначенный для передачи некоторых сведений об устройстве....</description>
			<content:encoded><![CDATA[<div><b><i>SNMP</i></b> - это такой сетевой протокол, предназначенный для передачи некоторых сведений об устройстве. Например, количество <i>CPU</i> на машине, <i>uptime</i> машины и т. д. Чтобы разобраться, какая схема взаимодействия в данном протоколе, необходимо ввести несколько терминов.<br />
[FIELDSET=&quot;Терминология&quot;]<b>SNMP-агент</b> - это то самое приложение, которое крутится на том самом устройстве, сведения о котором нам нужны.<br />
<b>SNMP-менеджер</b> - это приложение, которое опрашивает <i>SNMP</i>-агент, чтобы <i>SNMP</i>-агент предоставил <i>SNMP</i>-менеджеру необходимые сведения о машине.<br />
<b>OID (Object identifier)</b> - это имя того самого сведения, которое нам нужно. Еще <i>OID</i> называют <i>variable</i>. <i>OID</i>'ы могут быть представлены в различных форматах. Подробнее можно почитать <a rel="nofollow noopener noreferrer" href="https://linux.die.net/man/5/variables" target="_blank" title="https://linux.die.net/man/5/variables">тут</a>. Например, <i>OID</i> <i>uptime</i>'а имеет значение .1.3.6.1.2.1.1.3.0.<br />
<b>MIB</b> - это совокупность <i>OID</i>'ов, которые имеют древовидную структуру. Как видели примером выше, <i>OID</i> представляет собой последовательность цифр, разделенных точкой. Можно считать, что каждая цифра - это узел дерева, а последняя цифра - это лист, в котором непосредственно хранится необходимое нам значение. Каждый узел этого дерева имеет имя. В примере выше, лист имеет имя <i>sysUpTimeInstance</i>. <i>MIB</i> определяет взаимно однозначное соответствие между узлом дерева и его именем. Таким образом, <i>MIB</i> нужен для людей, чтобы читая <i>MIB</i>, можно было понять, о каком <i>OID</i> идет речь. Пример реализации своего <i>MIB</i>-файла можно найти <a rel="nofollow noopener noreferrer" href="http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/NET-SNMP-TUTORIAL-MIB.txt" target="_blank" title="http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/NET-SNMP-TUTORIAL-MIB.txt">тут</a>.<br />
[/FIELDSET]<br />
Схему взаимодействия можно хорошо представить на картинке:<br />
<a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7093&amp;d=1629991827" rel="Lightbox" id="attachment7093" ><img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=7093&amp;thumb=1&amp;d=1629991827" class="thumbnail" border="0" alt="Нажмите на изображение для увеличения
Название: SNMP.png
Просмотров: 487
Размер:	245.8 Кб
ID:	7093" style="margin: 5px" /></a><br />
<br />
Установить <i>SNMP</i>-агент:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="533616375"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="533616375" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw2">yum install</span> net-snmp</pre></td></tr></table></div></td></tr></tbody></table></div>Установить <i>SNMP</i>-менеджер:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="7425135"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="7425135" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw2">yum install</span> net-snmp-utils</pre></td></tr></table></div></td></tr></tbody></table></div>Отправить <i>GET</i>-запрос к <i>SNMP</i>-агенту:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="10088141"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="10088141" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">snmpget <span class="re5">-v</span> <span class="sy0">&lt;</span>версия протокола SNMP<span class="sy0">&gt;</span> <span class="re5">-c</span> <span class="sy0">&lt;</span>community string<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>IP-адрес SNMP-агента<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>OID<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Если нам необходимо получать информацию, которая не определена в стандартных <i>MIB</i>-файлах (стандартные <i>MIB</i>-файлы находятся в пакете <i>net-snmp-libs</i>), то у нас есть три способа:<ol style="list-style-type: decimal"><li>реализовать плагин для <i>net-snmp</i>;</li>
<li>реализовать субагента для <i>net-snmp</i>, который взаимодействовал бы по протоколу <i>agentx</i>;</li>
<li>изменить исходный код <i>net-snmp</i>.</li>
</ol>Больше информации можно получить <a rel="nofollow noopener noreferrer" href="https://net-snmp.sourceforge.io/wiki/index.php/Tutorials" target="_blank" title="https://net-snmp.sourceforge.io/wiki/index.php/Tutorials">тут</a>.</div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/7251.html</guid>
		</item>
		<item>
			<title>Знакомство с fanotify</title>
			<link>https://www.cyberforum.ru/blogs/899942/7240.html</link>
			<pubDate>Mon, 16 Aug 2021 10:51:54 GMT</pubDate>
			<description>В ядре Linux есть подсистема, которая называется fanotify. Данная подсистема позволяет ставить под...</description>
			<content:encoded><![CDATA[<div><blockquote>В ядре <i>Linux</i> есть подсистема, которая называется <i>fanotify</i>. Данная подсистема позволяет ставить под мониторинг файловые операции в операционной системе (ОС) над определенными объектами файловой системы: файлы, директории и <a rel="nofollow noopener noreferrer" href="http://www.linfo.org/mount_point.html" target="_blank" title="http://www.linfo.org/mount_point.html">точки монтирования</a>. Основным объектом в данной подсистеме является внутренний объект ядра, который называется <i><b>fanotify notification group</b></i> или просто <i><b>fanotify group</b></i> (<i>FG</i>). <i>FG</i> представляет собой список объектов файловой системы, которые находятся под мониторингом. Каждый объект в этом списке называется <i><b>entry</b></i>. <i>Entry</i> для файла или директории представляет собой <i><a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Inode" target="_blank" title="https://en.wikipedia.org/wiki/Inode">inode</a></i>, а для точки монтирования - это <i>mount ID</i>. Для каждого <i>entry</i> существуют две битовые маски: <i><b>mark</b></i> и <i><b>ignore</b></i>. Битовая маска <i>mark</i> устанавливает список событий, которые находятся под мониторингом. Например, событие чтения из файла или событие открытия файла или директории. Битовая маска <i>ignore</i> нужна для того, чтобы исключить из мониторинга какие-то объекты файловой системы. Например, у нас под мониторингом находится большая иерархия файлов и нам необходимо какой-то файл добавить в исключение из мониторинга.</blockquote><blockquote>Надо отметить тот факт, что подсистема <i>fanotify</i> очень часто используется для создания антивирусного ПО. Работа с данной подсистемой осуществляется через <i><b>event queue</b></i> - очередь событий. То есть, если мы реализуем ПО, которое занимается мониторингом событий на объектах файловой системы, то эти самые события считываются из очереди событий. Примеры событий мы уже приводили ранее: например, чтение или открытие файла. Событий существует два типа: <i><b>notification </b></i>(информативные события) и <i><b>permission</b></i> (события, требующие разрешения доступа). С точки зрения программного кода, события представляют собой структуру языка <i>C</i> <i><b>fanotify_event_metadata</b></i>.</blockquote><blockquote>Информативные события не требуют никакой обработки со стороны разработчика, пишущего ПО для мониторинга. Эти события носят чисто характер нотификаций о некоторой операции, которая произошла в файловой системе. Разработчик может использовать эту информацию, например, для вывода в лог истории операций. Единственное, о чем нельзя забывать, что надо закрыть файловый дескриптор в структуре <i>fanotify_event_metadata</i>. Это файловый дескриптор того объекта файловой системы, событие по которому пришло.</blockquote><blockquote>События, требующие разрешения доступа, обрабатываются по другому. Как только разработчик считает их из очереди событий, данные события помещаются в хранилище, которое называется <i><b>internal list</b></i> (внутренний список). В данном внутреннем списке события лежат до тех пор, пока:<ol style="list-style-type: decimal"><li>разработчик не ответит <i>fanotify</i>, разрешает он или запрещает операцию над объектом файловой системы;</li>
<li>не будет закрыт файловый дескриптор самого <i>FG</i>.</li>
</ol><br />
Ответ о разрешении или запрете операции над объектом файловой системы представляет собой структуру языка <i>C</i> <i><b>fanotify_response</b></i>. Данная структура должна быть записана в файловый дескриптор <i>FG</i>.<br />
</blockquote>Здесь я приведу небольшой и тривиальный пример работы с подсистемой <i>fanotify</i>:<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="104610337"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="104610337" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;fcntl.h&gt;</span>
<span class="co2">#include &lt;sys/fanotify.h&gt;</span>
<span class="co2">#include &lt;unistd.h&gt;</span>
&nbsp;
<span class="co2">#include &lt;cstdlib&gt;</span>
<span class="co2">#include &lt;cstring&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
&nbsp;
<span class="kw2">using</span> <span class="kw2">namespace</span> std<span class="sy4">;</span>
&nbsp;
<span class="kw4">void</span> ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; <span class="kw3">cerr</span> <span class="sy1">&lt;&lt;</span> <span class="kw3">strerror</span><span class="br0">&#40;</span><span class="kw2">errno</span><span class="br0">&#41;</span> <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp; <span class="kw3">exit</span><span class="br0">&#40;</span><span class="kw2">EXIT_FAILURE</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; Набор флагов, отвечающий за установку notification class'а слушающего приложения,</span>
<span class="coMULTI">&nbsp; а также установка повередения файлового дескриптора.</span>
<span class="coMULTI">&nbsp; */</span>
&nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> flags <span class="sy1">=</span>
&nbsp; &nbsp; FAN_CLASS_CONTENT <span class="sy3">|</span> <span class="co1">// notification class, который нужен, если создается антивирус</span>
&nbsp; &nbsp; FAN_UNLIMITED_QUEUE<span class="sy4">;</span> <span class="co1">// флаг поведения, убирающий ограничеие на размер очереди событий</span>
&nbsp;
&nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; Набор флагов, отвечающий за файловый статус файлового дескриптора.</span>
<span class="coMULTI">&nbsp; Это те же флаги, которые передаются при открытии обычного файла</span>
<span class="coMULTI">&nbsp; системным вызовом open.</span>
<span class="coMULTI">&nbsp; */</span>
&nbsp; <span class="kw4">unsigned</span> <span class="kw4">int</span> event_f_flags <span class="sy1">=</span> O_RDONLY <span class="sy3">|</span> O_LARGEFILE<span class="sy4">;</span>
&nbsp;
&nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; Создаем внуренний объект ядра ОС, который называется fanotify notification group.</span>
<span class="coMULTI">&nbsp; Функция fanotify_init возвращает файловый дескриптор для доступа к очереди событий,</span>
<span class="coMULTI">&nbsp; которая принадлежит только что созданной fanotify notification group.</span>
<span class="coMULTI">&nbsp; */</span>
&nbsp; <span class="kw4">int</span> fng <span class="sy1">=</span> fanotify_init<span class="br0">&#40;</span>flags, event_f_flags<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fng <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;fanotify_init<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; Набор флагов, которые описывают, должны ли быть взведены флаги mark и/или</span>
<span class="coMULTI">&nbsp; ignore для определенного набора событий для объекта файловой системы в fanotify</span>
<span class="coMULTI">&nbsp; notification group. Объект файловой системы передается двумя последними параметрами</span>
<span class="coMULTI">&nbsp; в функции fanotify_mark.</span>
<span class="coMULTI">&nbsp; */</span>
&nbsp; flags <span class="sy1">=</span> FAN_MARK_ADD <span class="sy3">|</span> FAN_MARK_MOUNT<span class="sy4">;</span>
&nbsp;
&nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; Набор флагов, которые описывают те события, которые должны быть промаркированы</span>
<span class="coMULTI">&nbsp; или проигнорированы в данном fanotify notification group. Маркирование или</span>
<span class="coMULTI">&nbsp; игнорирование событий задается с помощью проедыдещего набора флагов flags.</span>
<span class="coMULTI">&nbsp; */</span>
&nbsp; <span class="kw4">uint64_t</span> mask <span class="sy1">=</span> FAN_ACCESS_PERM<span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fanotify_mark<span class="br0">&#40;</span>fng, flags, mask, AT_FDCWD, <span class="st0">&quot;/root/temp/loopfs&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;fanotify_mark<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="co1">// Установим исключение на один из объектов в папке /root/temp/loopfs</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fanotify_mark<span class="br0">&#40;</span>fng, FAN_MARK_ADD <span class="sy3">|</span> FAN_MARK_IGNORED_MASK, FAN_ACCESS_PERM, AT_FDCWD, <span class="st0">&quot;/root/temp/loopfs/folder/subfolder/test1.txt&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;fanotify_mark<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; 
&nbsp; <span class="kw4">struct</span> fanotify_event_metadata buffer <span class="br0">&#91;</span><span class="nu0">200</span><span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">const</span> <span class="kw4">struct</span> fanotify_event_metadata<span class="sy2">*</span> metadata <span class="sy1">=</span> <span class="kw2">nullptr</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="co1">// Читаем событие из очереди событий, которая принадлежит fanotify notification group</span>
&nbsp; <span class="kw4">size_t</span> length <span class="sy1">=</span> read<span class="br0">&#40;</span>fng, buffer, <span class="kw3">sizeof</span><span class="br0">&#40;</span>buffer<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>length <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;length = &quot;</span> <span class="sy1">&lt;&lt;</span> length <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp;
&nbsp; metadata <span class="sy1">=</span> buffer<span class="sy4">;</span>
&nbsp; 
&nbsp; <span class="co1">// Начинаем обрабатывать прочитанные события</span>
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>FAN_EVENT_OK<span class="br0">&#40;</span>metadata, length<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Проверяем версию структуры fanotify_event_metadata</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>metadata<span class="sy2">-</span><span class="sy1">&gt;</span>vers <span class="sy3">!</span><span class="sy1">=</span> FANOTIFY_METADATA_VERSION<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw3">cerr</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Mismatch of fanotify metadata version<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">EXIT_FAILURE</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Проверяем, что файловый дестриптом объекта файловой системы корректен</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>metadata<span class="sy2">-</span><span class="sy1">&gt;</span>fd <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; <span class="co1">// Проверямем, что полученное событие это событие FAN_ACCESS_PERM</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>metadata<span class="sy2">-</span><span class="sy1">&gt;</span>mask <span class="sy3">&amp;</span> FAN_ACCESS_PERM<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;FAN_ACCESS_PERM: fd = &quot;</span> <span class="sy1">&lt;&lt;</span> metadata<span class="sy2">-</span><span class="sy1">&gt;</span>fd <span class="sy1">&lt;&lt;</span> endl<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/*</span>
<span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; Подготавливаем ответ по событию - резрешить или запретить</span>
<span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; (В данном случае мы запрещаем действие над объектом файловой системы)</span>
<span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; */</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> fanotify_response response<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; response.<span class="me1">fd</span> <span class="sy1">=</span> metadata<span class="sy2">-</span><span class="sy1">&gt;</span>fd<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; response.<span class="me1">response</span> <span class="sy1">=</span> FAN_DENY<span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Отправляем ответ</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>write<span class="br0">&#40;</span>fng, <span class="sy3">&amp;</span>response, <span class="kw3">sizeof</span><span class="br0">&#40;</span>response<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Закрываем файловый дескриптор объекта операционной системы</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>close<span class="br0">&#40;</span>metadata<span class="sy2">-</span><span class="sy1">&gt;</span>fd<span class="br0">&#41;</span> <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw3">cerr</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Invalid metadata-&gt;fd<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Переходим к следующему событию</span>
&nbsp; &nbsp; metadata <span class="sy1">=</span> FAN_EVENT_NEXT<span class="br0">&#40;</span>metadata, length<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Закрываем файловый дескриптор fanotify notification group</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>close<span class="br0">&#40;</span>fng<span class="br0">&#41;</span> <span class="sy1">==</span> <span class="sy2">-</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; ExitProgram<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;SUCCESS<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">return</span> <span class="kw2">EXIT_SUCCESS</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div><blockquote>Стоит отменить тот факт, что данная подсистема имеет ряд ограничений. Например:<ol style="list-style-type: decimal"><li>Нельзя поставить под мониторинг директорию вместе со всеми файлами и поддиректориями, которые находятся в данной директории. Чтобы такое осуществить, директория должна представлять собой точку монтирования, что неудобно в некоторых случаях.</li>
<li>Также нельзя исключить из сканирования директорию. Исключение из сканирования доступно только для файлов. Чтобы исключить из сканирования директорию необходимо превратить ее в точку монтирования, например, с помощью <code class="inlinecode">mount bind</code>, что опять неудобно.</li>
</ol></blockquote></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/7240.html</guid>
		</item>
		<item>
			<title>Шпаргалка по iptables</title>
			<link>https://www.cyberforum.ru/blogs/899942/7077.html</link>
			<pubDate>Mon, 12 Apr 2021 10:54:39 GMT</pubDate>
			<description>*Netfilter* - файрвол/брандмауэр ядра Linux. 
*iptables* - утилита для управления Netfilter. 
На...</description>
			<content:encoded><![CDATA[<div>[FIELDSET=&quot;Терминология&quot;]<b>Netfilter</b> - файрвол/брандмауэр ядра <i>Linux</i>.<br />
<b>iptables</b> - утилита для управления <i>Netfilter</i>.<br />
[/FIELDSET]<blockquote>На абстрактном уровне <i>iptables</i> состоит из таблиц (<i>tables</i>). Каждая таблица состоит из цепочек (<i>chains</i>). Каждая цепочка состоит из правил (<i>rules</i>). Надо понимать тот факт, что таблицей по умолчанию является таблица <b>Filter</b>. В этой таблице записываются правила, согласно которым фильтруется входящий/исходящий трафик. За входящий трафик отвечает цепочка <b>INPUT</b>, за исходящий трафик - <b>OUTPUT</b>. Соответственно, в цепочке <i>INPUT</i> мы пишем правила, согласно которым мы разрешаем трафику приходить на хост, а в цепочке <i>OUTPUT</i> - правила, согласно которым трафик может уходить с хоста. Все описанное в данном абзаце это <b>СИЛЬНО</b> упрощенная информация, которой обычно достаточно на практике, если вы не практикующийся системный администратор.</blockquote><blockquote>Более подробно можно почитать <a rel="nofollow noopener noreferrer" href="https://www.thegeekstuff.com/2011/01/iptables-fundamentals/" target="_blank" title="https://www.thegeekstuff.com/2011/01/iptables-fundamentals/">здесь</a> и <a rel="nofollow noopener noreferrer" href="https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture" target="_blank" title="https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture">здесь</a>. В этих же ссылках дана информация о том, как пакет проходит через файрвол, то есть, при каких условиях в каком порядке какие цепочки каких таблиц применяются. Также, в этих ссылках дана информация о том, как применяются правила цепочек. Также есть такая штука, как <b>policy</b> - поведение в цепочке в том случае, если ни одно из правил не подошло.</blockquote>Посмотреть текущие правила, 1 вариант:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="609930411"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="609930411" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-L</span> <span class="re5">-n</span> <span class="re5">-v</span> <span class="re5">--line-number</span></pre></td></tr></table></div></td></tr></tbody></table></div>Посмотреть текущие правила, 2 вариант:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="11429284"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="11429284" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-S</span></pre></td></tr></table></div></td></tr></tbody></table></div>Добавить новое правило:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="570730954"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="570730954" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-A</span> <span class="sy0">&lt;</span>имя цепочки<span class="sy0">&gt;</span> <span class="re5">-p</span> <span class="sy0">&lt;</span>протокол<span class="sy0">&gt;</span> <span class="re5">--dport</span> <span class="sy0">&lt;</span>номер порта<span class="sy0">&gt;</span> <span class="re5">-j</span> <span class="sy0">&lt;</span>имя действия<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Удалить правило, 1 вариант:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="762698809"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="762698809" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-D</span> <span class="sy0">&lt;</span>имя цепочки<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>номер правила из iptables <span class="re5">-L</span> <span class="re5">-n</span> <span class="re5">-v</span> --line-number<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Удалить правило, 2 вариант:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="992215451"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="992215451" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-D</span> <span class="sy0">&lt;</span>описание правила из iptables -S<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Установить политику (<i>policy</i>):<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="18031496"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="18031496" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">iptables <span class="re5">-P</span> <span class="sy0">&lt;</span>имя цепочки<span class="sy0">&gt;</span> <span class="sy0">&lt;</span>имя действия<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div><ul><li>&lt;имя цепочки&gt; - <i>INPUT</i>, <i>OUTPUT</i>, <i>FORWARD</i> и т. д.</li>
<li>&lt;протокол&gt; - <i>tcp</i>, <i>udp</i> и т. д.</li>
<li>&lt;имя действия&gt; - <i>ACCEPT</i>, <i>REJECT</i>, <i>DROP</i> и т. д.</li>
</ul></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/7077.html</guid>
		</item>
		<item>
			<title>Преобразование строки в число</title>
			<link>https://www.cyberforum.ru/blogs/899942/6748.html</link>
			<pubDate>Fri, 02 Oct 2020 11:42:11 GMT</pubDate>
			<description>Функция, проверяющая, что входная строка содержит корректное для заданного целочисленного типа...</description>
			<content:encoded><![CDATA[<div>Функция, проверяющая, что входная строка содержит корректное для заданного целочисленного типа значение в пределах допустимых значений. На вход передается строка, а необходимый целочисленный тип задается как параметр шаблона.<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="157502803"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="157502803" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
</pre></td><td class="de1"><pre class="de1"><span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T, <span class="kw2">typename</span> <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">enable_if_t</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">is_integral</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="sy1">&gt;&gt;</span>
<span class="kw4">bool</span> check_is_integral<span class="br0">&#40;</span><span class="kw4">const</span> std<span class="sy4">::</span><span class="me2">string</span><span class="sy3">&amp;</span> str<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; <span class="co1">// Случай str == ''</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>str.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Случай str == '+' или str == '-'</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">1</span> <span class="sy3">&amp;&amp;</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'-'</span> <span class="sy3">||</span> str<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'+'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Случай str == '000' или str == '+000' или str == '-000'</span>
&nbsp; std<span class="sy4">::</span><span class="kw4">size_t</span> begin <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'-'</span> <span class="sy3">||</span> str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'+'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; begin<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>begin <span class="sy1">&lt;</span> str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy3">&amp;&amp;</span> str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'0'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; begin<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>begin <span class="sy1">&gt;=</span> str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Основной алгоритм</span>
&nbsp; begin <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; <span class="kw4">bool</span> is_negative <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">is_signed</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'-'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; is_negative <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'-'</span> <span class="sy3">||</span> str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'+'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; begin<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'+'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; begin<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Убираем ведущие нули</span>
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>str<span class="br0">&#91;</span>begin<span class="br0">&#93;</span> <span class="sy1">==</span> <span class="st0">'0'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; begin<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Случай str == '1234a56'</span>
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> begin<span class="sy4">;</span> i <span class="sy1">&lt;</span> str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>std<span class="sy4">::</span><span class="kw3">isdigit</span><span class="br0">&#40;</span>str<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Проверка границ</span>
&nbsp; std<span class="sy4">::</span><span class="me2">string</span> ref_value <span class="sy1">=</span>
&nbsp; &nbsp; &nbsp; is_negative <span class="sy4">?</span> std<span class="sy4">::</span><span class="me2">to_string</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">numeric_limits</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">min</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">substr</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span> std<span class="sy4">::</span><span class="me2">to_string</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">numeric_limits</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">max</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">-</span> begin<span class="br0">&#41;</span> <span class="sy1">&lt;</span> ref_value.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">-</span> begin<span class="br0">&#41;</span> <span class="sy1">&gt;</span> ref_value.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> begin<span class="sy4">;</span> i <span class="sy1">&lt;</span> str.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ref_value<span class="br0">&#91;</span>i <span class="sy2">-</span> begin<span class="br0">&#93;</span> <span class="sy1">&gt;</span> str<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>ref_value<span class="br0">&#91;</span>i <span class="sy2">-</span> begin<span class="br0">&#93;</span> <span class="sy1">&lt;</span> str<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6748.html</guid>
		</item>
		<item>
			<title>Потокобезопасная очередь</title>
			<link>https://www.cyberforum.ru/blogs/899942/6702.html</link>
			<pubDate>Mon, 10 Aug 2020 13:51:03 GMT</pubDate>
			<description>Оставляю здесь кусок кода, который возможно мне понадобится в будущем. 
 
#pragma once 
 
//...</description>
			<content:encoded><![CDATA[<div>Оставляю здесь кусок кода, который возможно мне понадобится в будущем.<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="795613415"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="795613415" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
</pre></td><td class="de1"><pre class="de1"><span class="co2">#pragma once</span>
&nbsp;
<span class="co1">// Очередь реализуется согласано книге Anthony Williams -</span>
<span class="co1">// &quot;C++ Concurrency in Action: Practical Multithreading&quot;.</span>
<span class="co1">// Смотреть главу 6, раздел 6.2</span>
&nbsp;
<span class="co2">#include &lt;condition_variable&gt;</span>
<span class="co2">#include &lt;memory&gt;</span>
<span class="co2">#include &lt;mutex&gt;</span>
&nbsp;
<span class="kw2">template</span> <span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span>
<span class="kw2">class</span> ThreadSafeQueue <span class="br0">&#123;</span>
&nbsp;<span class="kw2">private</span><span class="sy4">:</span>
&nbsp; <span class="kw2">using</span> LockGuard <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">lock_guard</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">&gt;</span><span class="sy4">;</span>
&nbsp; <span class="kw2">using</span> UniqueLock <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">unique_lock</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">&gt;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="co1">// Очередь реализуется в виде односвязного списка</span>
&nbsp; <span class="kw4">struct</span> Node <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="co1">// Данные в узле списка</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">shared_ptr</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> data <span class="sy1">=</span> <span class="kw2">nullptr</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Указатель на следующей элемент в списке</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> next <span class="sy1">=</span> <span class="kw2">nullptr</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp;<span class="kw2">private</span><span class="sy4">:</span>
&nbsp; <span class="co1">// Потокобезопасный доступ к концу очереди</span>
&nbsp; <span class="kw4">const</span> Node<span class="sy2">*</span> get_tail<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; LockGuard tail_lock<span class="br0">&#40;</span>m_tail_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> m_tail<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Извлечение из начала очереди</span>
&nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> pop_head<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> old_head <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>m_head<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; m_head <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>old_head<span class="sy2">-</span><span class="sy1">&gt;</span>next<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>old_head<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Ожидание появления данных в очереди</span>
&nbsp; UniqueLock wait_for_data<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; UniqueLock head_lock<span class="br0">&#40;</span>m_head_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; m_data_cond.<span class="me1">wait</span><span class="br0">&#40;</span>head_lock, <span class="br0">&#91;</span><span class="kw3">this</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> m_head.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> get_tail<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>head_lock<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp;<span class="kw2">public</span><span class="sy4">:</span>
&nbsp; <span class="co1">// Создаем фиктивный узел, чтобы next никогда не указывал на nullptr.</span>
&nbsp; <span class="co1">// Это необходимо для потокобезопасной работы и удобства.</span>
&nbsp; ThreadSafeQueue<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy4">:</span> m_head<span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">make_unique</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, m_tail<span class="br0">&#40;</span>m_head.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp; ThreadSafeQueue<span class="br0">&#40;</span><span class="kw4">const</span> ThreadSafeQueue<span class="sy3">&amp;</span><span class="br0">&#41;</span> <span class="sy1">=</span> <span class="kw3">delete</span><span class="sy4">;</span>
&nbsp; ThreadSafeQueue<span class="sy3">&amp;</span> operator<span class="sy1">=</span><span class="br0">&#40;</span><span class="kw4">const</span> ThreadSafeQueue<span class="sy3">&amp;</span><span class="br0">&#41;</span> <span class="sy1">=</span> <span class="kw3">delete</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="co1">// Проверка наличия элемента и если он есть, то извлечение</span>
&nbsp; std<span class="sy4">::</span><span class="me2">shared_ptr</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> try_pop<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; LockGuard head_lock<span class="br0">&#40;</span>m_head_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>m_head.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">==</span> get_tail<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">nullptr</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> old_head <span class="sy1">=</span> pop_head<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> old_head<span class="sy2">-</span><span class="sy1">&gt;</span>data<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Проверка наличия элемента и если он есть, то извлечение</span>
&nbsp; <span class="kw4">bool</span> try_pop<span class="br0">&#40;</span>T<span class="sy3">&amp;</span> value<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; LockGuard head_lock<span class="br0">&#40;</span>m_head_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>m_head.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">==</span> get_tail<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; value <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span><span class="sy2">*</span>m_head<span class="sy2">-</span><span class="sy1">&gt;</span>data<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; pop_head<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Извлечение элемента из очереди с ожиданием</span>
&nbsp; std<span class="sy4">::</span><span class="me2">shared_ptr</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> wait_and_pop<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; UniqueLock head_lock<span class="br0">&#40;</span>wait_for_data<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> old_head <span class="sy1">=</span> pop_head<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> old_head<span class="sy2">-</span><span class="sy1">&gt;</span>data<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Извлечение элемента из очереди с ожиданием</span>
&nbsp; <span class="kw4">void</span> wait_and_pop<span class="br0">&#40;</span>T<span class="sy3">&amp;</span> value<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; UniqueLock head_lock<span class="br0">&#40;</span>wait_for_data<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; value <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span><span class="sy2">*</span>m_head<span class="sy2">-</span><span class="sy1">&gt;</span>data<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; pop_head<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="co1">// Вставка нового элемента в очередь. Надо понимать тот факт,</span>
&nbsp; <span class="co1">// что фиктивная нода всегда находится в конце связного списка.</span>
&nbsp; <span class="co1">// Если на фиктивную ноду указывают начало и конец очереди,</span>
&nbsp; <span class="co1">// значит очередь пуста.</span>
&nbsp; <span class="kw4">void</span> push<span class="br0">&#40;</span>T new_value<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">shared_ptr</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span> new_data <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">make_shared</span><span class="sy1">&lt;</span>T<span class="sy1">&gt;</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>new_value<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> new_dummy_node <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">make_unique</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; LockGuard tail_lock<span class="br0">&#40;</span>m_tail_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; Node<span class="sy2">*</span> old_tail <span class="sy1">=</span> m_tail<span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; m_tail <span class="sy1">=</span> new_dummy_node.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; old_tail<span class="sy2">-</span><span class="sy1">&gt;</span>data <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>new_data<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; old_tail<span class="sy2">-</span><span class="sy1">&gt;</span>next <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">move</span><span class="br0">&#40;</span>new_dummy_node<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; m_data_cond.<span class="me1">notify_one</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw4">bool</span> empty<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw4">const</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; LockGuard head_lock<span class="br0">&#40;</span>m_head_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> m_head.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">==</span> get_tail<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp;<span class="kw2">private</span><span class="sy4">:</span>
&nbsp; <span class="co1">// Начало очереди</span>
&nbsp; <span class="kw4">mutable</span> std<span class="sy4">::</span><span class="me2">mutex</span> m_head_mutex<span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">unique_ptr</span><span class="sy1">&lt;</span>Node<span class="sy1">&gt;</span> m_head<span class="sy4">;</span>
&nbsp;
&nbsp; <span class="co1">// Конец очереди</span>
&nbsp; <span class="kw4">mutable</span> std<span class="sy4">::</span><span class="me2">mutex</span> m_tail_mutex<span class="sy4">;</span>
&nbsp; Node<span class="sy2">*</span> m_tail<span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">condition_variable</span> m_data_cond<span class="sy4">;</span>
<span class="br0">&#125;</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Unit-тесты к предыдущему коду:<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="495981682"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="495981682" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;algorithm&gt;</span>
<span class="co2">#include &lt;future&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;utility&gt;</span>
&nbsp;
<span class="co2">#include &lt;gtest/gtest.h&gt;</span>
<span class="co2">#include &quot;thread_safe_queue.h&quot;</span>
&nbsp;
<span class="kw2">class</span> ThreadSafeQueueTest <span class="sy4">:</span> <span class="kw2">public</span> <span class="sy4">::</span><span class="me2">testing</span><span class="sy4">::</span><span class="me2">Test</span> <span class="br0">&#123;</span>
&nbsp;<span class="kw2">public</span><span class="sy4">:</span>
&nbsp; <span class="kw2">using</span> Pair <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">pair</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="kw4">size_t</span>, std<span class="sy4">::</span><span class="kw4">size_t</span><span class="sy1">&gt;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw4">void</span> push_to_queue<span class="br0">&#40;</span>ThreadSafeQueue<span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span><span class="sy3">&amp;</span> queue, std<span class="sy4">::</span><span class="kw4">size_t</span> number,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std<span class="sy4">::</span><span class="kw4">size_t</span> count<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> count<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; queue.<span class="me1">push</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">make_pair</span><span class="br0">&#40;</span>number, i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> wait_and_pop_from_queue<span class="br0">&#40;</span>ThreadSafeQueue<span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span><span class="sy3">&amp;</span> queue,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw4">size_t</span> count<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> pairs<span class="br0">&#40;</span>count<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> count<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; queue.<span class="me1">wait_and_pop</span><span class="br0">&#40;</span>pairs<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> pairs<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> try_pop_from_queue<span class="br0">&#40;</span>ThreadSafeQueue<span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span><span class="sy3">&amp;</span> queue,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std<span class="sy4">::</span><span class="kw4">size_t</span> count<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> pairs<span class="sy4">;</span>
&nbsp; &nbsp; pairs.<span class="me1">reserve</span><span class="br0">&#40;</span>count<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> count<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; <span class="kw4">auto</span> result <span class="sy1">=</span> queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>result<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; pairs.<span class="me1">push_back</span><span class="br0">&#40;</span><span class="sy2">*</span>result<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> pairs<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
TEST_F<span class="br0">&#40;</span>ThreadSafeQueueTest, one_push_pop<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; ThreadSafeQueue<span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="kw4">size_t</span><span class="sy1">&gt;</span> queue<span class="sy4">;</span>
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; queue.<span class="me1">push</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_FALSE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="kw4">size_t</span> pop_result <span class="sy1">=</span> <span class="sy2">*</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>pop_result, <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; queue.<span class="me1">push</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_FALSE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span>pop_result<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>pop_result, <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
TEST_F<span class="br0">&#40;</span>ThreadSafeQueueTest, many_push_pop<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; ThreadSafeQueue<span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="kw4">size_t</span><span class="sy1">&gt;</span> queue<span class="sy4">;</span>
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; queue.<span class="me1">push</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; queue.<span class="me1">push</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_FALSE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="kw4">size_t</span> pop_result <span class="sy1">=</span> <span class="sy2">*</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_FALSE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>pop_result, <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span>pop_result<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>pop_result, <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
TEST_F<span class="br0">&#40;</span>ThreadSafeQueueTest, wait_and_pop_from_queue<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; ThreadSafeQueue<span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> queue<span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> push1 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">push_to_queue</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="nu0">5</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> push2 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">push_to_queue</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">1</span>, <span class="nu0">5</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;&gt;</span> pop1 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span>
&nbsp; &nbsp; &nbsp; <span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">wait_and_pop_from_queue</span>, <span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; push1.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; push2.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">auto</span> result <span class="sy1">=</span> pop1.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">stable_partition</span><span class="br0">&#40;</span>result.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, result.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="kw4">const</span> Pair<span class="sy3">&amp;</span> pair<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> pair.<span class="me1">first</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> expected <span class="sy1">=</span> <span class="br0">&#123;</span><span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">1</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">2</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">3</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">4</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">0</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">3</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">4</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>result, expected<span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
TEST_F<span class="br0">&#40;</span>ThreadSafeQueueTest, try_pop_from_queue<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; ThreadSafeQueue<span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> queue<span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> push1 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">push_to_queue</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">0</span>, <span class="nu0">5</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="sy1">&gt;</span> push2 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">push_to_queue</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">1</span>, <span class="nu0">5</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">future</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;&gt;</span> pop1 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">async</span><span class="br0">&#40;</span>
&nbsp; &nbsp; &nbsp; <span class="sy3">&amp;</span>ThreadSafeQueueTest<span class="sy4">::</span><span class="me2">try_pop_from_queue</span>, <span class="kw3">this</span>, std<span class="sy4">::</span><span class="me2">ref</span><span class="br0">&#40;</span>queue<span class="br0">&#41;</span>, <span class="nu0">10</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; push1.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; push2.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">auto</span> result <span class="sy1">=</span> pop1.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy3">!</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; result.<span class="me1">push_back</span><span class="br0">&#40;</span><span class="sy2">*</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">stable_partition</span><span class="br0">&#40;</span>result.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, result.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="kw4">const</span> Pair<span class="sy3">&amp;</span> pair<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> pair.<span class="me1">first</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>Pair<span class="sy1">&gt;</span> expected <span class="sy1">=</span> <span class="br0">&#123;</span><span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">1</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">2</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">3</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">0</span>, <span class="nu0">4</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">0</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">3</span><span class="br0">&#125;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">4</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; ASSERT_TRUE<span class="br0">&#40;</span>queue.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>queue.<span class="me1">try_pop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; ASSERT_EQ<span class="br0">&#40;</span>result, expected<span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span><span class="sy2">**</span> argv<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; <span class="sy4">::</span><span class="me2">testing</span><span class="sy4">::</span><span class="me2">InitGoogleTest</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>argc, argv<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw1">return</span> RUN_ALL_TESTS<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6702.html</guid>
		</item>
		<item>
			<title>Intervals problem</title>
			<link>https://www.cyberforum.ru/blogs/899942/6448.html</link>
			<pubDate>Wed, 25 Mar 2020 13:42:47 GMT</pubDate>
			<description>Поиск общих интервалов между массивами интервалов. 
 
 
using System; 
using...</description>
			<content:encoded><![CDATA[<div>Поиск общих интервалов между массивами интервалов.<br />
<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="916647168"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="916647168" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
</pre></td><td class="de1"><pre class="de1"><span class="kw1">using</span> <span class="co3">System</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Collections.Generic</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">namespace</span> intervals
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> Program
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> CommonManyIntervals<span class="br0">&#40;</span>List<span class="sy0">&lt;</span>List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;&gt;</span> vectors<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> result <span class="sy0">=</span> CommonTwoIntervals<span class="br0">&#40;</span>vectors<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, vectors<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> vectors<span class="sy0">.</span><span class="me1">Count</span><span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy0">=</span> CommonTwoIntervals<span class="br0">&#40;</span>result, vectors<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> result<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> CommonTwoIntervals<span class="br0">&#40;</span>List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> a, List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> b<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> result <span class="sy0">=</span> <span class="kw3">new</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> aPtr <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bPtr <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>aPtr <span class="sy0">&lt;</span> a<span class="sy0">.</span><span class="me1">Count</span> <span class="sy0">&amp;&amp;</span> bPtr <span class="sy0">&lt;</span> b<span class="sy0">.</span><span class="me1">Count</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>a<span class="br0">&#91;</span>aPtr<span class="br0">&#93;</span> <span class="sy0">&lt;</span> b<span class="br0">&#91;</span>bPtr<span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> next <span class="sy0">=</span> a<span class="br0">&#91;</span>aPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>next <span class="sy0">&lt;</span> b<span class="br0">&#91;</span>bPtr<span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aPtr <span class="sy0">+=</span> <span class="nu0">2</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> next <span class="sy0">=</span> b<span class="br0">&#91;</span>bPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>next <span class="sy0">&lt;</span> a<span class="br0">&#91;</span>aPtr<span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bPtr <span class="sy0">+=</span> <span class="nu0">2</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> begin <span class="sy0">=</span> Math<span class="sy0">.</span><span class="me1">Max</span><span class="br0">&#40;</span>a<span class="br0">&#91;</span>aPtr<span class="br0">&#93;</span>, b<span class="br0">&#91;</span>bPtr<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> end <span class="sy0">=</span> Math<span class="sy0">.</span><span class="me1">Min</span><span class="br0">&#40;</span>a<span class="br0">&#91;</span>aPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span>, b<span class="br0">&#91;</span>bPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>begin<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>end<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>a<span class="br0">&#91;</span>aPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span> <span class="sy0">&lt;</span> b<span class="br0">&#91;</span>bPtr <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aPtr <span class="sy0">+=</span> <span class="nu0">2</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bPtr <span class="sy0">+=</span> <span class="nu0">2</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> result<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">Write</span><span class="br0">&#40;</span><span class="st0">&quot;Enter number of arrays: &quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> arraysNumber <span class="sy0">=</span> Convert<span class="sy0">.</span><span class="me1">ToInt32</span><span class="br0">&#40;</span>Console<span class="sy0">.</span><span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>arraysNumber <span class="sy0">&lt;</span> <span class="nu0">2</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;Number of arrays must be greater than one&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Random random <span class="sy0">=</span> <span class="kw3">new</span> Random<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span>List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;&gt;</span> vectors <span class="sy0">=</span> <span class="kw3">new</span> List<span class="sy0">&lt;</span>List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> arraysNumber<span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> length<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length <span class="sy0">=</span> random<span class="sy0">.</span><span class="me1">Next</span><span class="br0">&#40;</span>MAX_LENGTH<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>length <span class="sy0">%</span> <span class="nu0">2</span> <span class="sy0">!=</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> vector <span class="sy0">=</span> <span class="kw3">new</span> List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> length<span class="sy0">;</span> <span class="sy0">++</span>j<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vector<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>random<span class="sy0">.</span><span class="me1">Next</span><span class="br0">&#40;</span>MAX_VALUE<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vector<span class="sy0">.</span><span class="me1">Sort</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vectors<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>vector<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span>List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> vector <span class="kw1">in</span> vectors<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">Write</span><span class="br0">&#40;</span><span class="st0">&quot;# &quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="kw4">int</span> number <span class="kw1">in</span> vector<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">Write</span><span class="br0">&#40;</span><span class="st0">&quot;{0} &quot;</span>, number<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span><span class="kw4">int</span><span class="sy0">&gt;</span> results <span class="sy0">=</span> CommonManyIntervals<span class="br0">&#40;</span>vectors<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">Write</span><span class="br0">&#40;</span><span class="st0">&quot;Results: &quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">int</span> result <span class="kw1">in</span> results<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">Write</span><span class="br0">&#40;</span><span class="st0">&quot;{0} &quot;</span>, result<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">const</span> <span class="kw4">int</span> MAX_VALUE <span class="sy0">=</span> <span class="nu0">30</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">const</span> <span class="kw4">int</span> MAX_LENGTH <span class="sy0">=</span> <span class="nu0">10</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6448.html</guid>
		</item>
		<item>
			<title>Concurrency problem</title>
			<link>https://www.cyberforum.ru/blogs/899942/6446.html</link>
			<pubDate>Mon, 23 Mar 2020 11:40:10 GMT</pubDate>
			<description>Асинхронный запуск переданных лямбда-функций в том порядке, в котором они переданы. 
 
 
#include...</description>
			<content:encoded><![CDATA[<div>Асинхронный запуск переданных лямбда-функций в том порядке, в котором они переданы.<br />
<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="163418761"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="163418761" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;atomic&gt;</span>
<span class="co2">#include &lt;condition_variable&gt;</span>
<span class="co2">#include &lt;functional&gt;</span>
<span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;list&gt;</span>
<span class="co2">#include &lt;mutex&gt;</span>
<span class="co2">#include &lt;thread&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
&nbsp;
<span class="kw2">class</span> Executor
<span class="br0">&#123;</span>
<span class="kw2">public</span><span class="sy4">:</span>
&nbsp; Executor<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">:</span> _firstExec<span class="br0">&#123;</span><span class="kw2">true</span><span class="br0">&#125;</span>, _isStop<span class="br0">&#123;</span><span class="kw2">false</span><span class="br0">&#125;</span>
&nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span>
&nbsp;
&nbsp; ~Executor<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">lock_guard</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">&gt;</span> lock<span class="br0">&#40;</span>_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; _isStop <span class="sy1">=</span> <span class="kw2">true</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; _cv.<span class="me1">notify_one</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>_threads.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; _threads.<span class="me1">at</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; 
&nbsp; <span class="kw4">void</span> Exec<span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">function</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy1">&gt;</span> func<span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">lock_guard</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">&gt;</span> lock<span class="br0">&#40;</span>_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; _funcs.<span class="me1">push_back</span><span class="br0">&#40;</span>func<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; _cv.<span class="me1">notify_one</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_firstExec<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; _threads.<span class="me1">push_back</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">thread</span><span class="br0">&#40;</span><span class="sy3">&amp;</span>Executor<span class="sy4">::</span><span class="me2">Run</span>, <span class="kw3">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; _firstExec <span class="sy1">=</span> <span class="kw2">false</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
<span class="kw2">private</span><span class="sy4">:</span>
&nbsp; <span class="kw4">void</span> Run<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy3">!</span>_isStop<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">unique_lock</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">mutex</span><span class="sy1">&gt;</span> lock<span class="br0">&#40;</span>_mutex<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy3">!</span>_funcs.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">auto</span> func <span class="sy1">=</span> _funcs.<span class="me1">front</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; _funcs.<span class="me1">pop_front</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; lock.<span class="me1">unlock</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; func<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; _cv.<span class="me1">wait</span><span class="br0">&#40;</span>lock, <span class="br0">&#91;</span><span class="kw3">this</span><span class="br0">&#93;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">return</span> <span class="sy3">!</span>_funcs.<span class="me1">empty</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy3">||</span> _isStop<span class="sy4">;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; 
&nbsp; <span class="kw4">bool</span> _firstExec<span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">atomic</span><span class="sy1">&lt;</span><span class="kw4">bool</span><span class="sy1">&gt;</span> _isStop<span class="sy4">;</span>
&nbsp; 
&nbsp; std<span class="sy4">::</span><span class="me2">list</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">function</span><span class="sy1">&lt;</span><span class="kw4">void</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy1">&gt;&gt;</span> _funcs<span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">thread</span><span class="sy1">&gt;</span> _threads<span class="sy4">;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">mutex</span> _mutex<span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">condition_variable</span> _cv<span class="sy4">;</span>
<span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
<span class="kw4">void</span> TestFunc<span class="br0">&#40;</span>Executor <span class="sy3">&amp;</span> executor, <span class="kw4">int</span> number<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; executor.<span class="me1">Exec</span><span class="br0">&#40;</span><span class="br0">&#91;</span>number<span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;HI: &quot;</span> <span class="sy1">&lt;&lt;</span> number <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; Executor executor<span class="sy4">;</span>
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> <span class="nu0">6</span><span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>i <span class="sy1">&gt;</span> <span class="nu0">0</span> <span class="sy3">&amp;&amp;</span> i <span class="sy2">%</span> <span class="nu0">2</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Main: HI&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">this_thread</span><span class="sy4">::</span><span class="me2">sleep_for</span><span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">chrono</span><span class="sy4">::</span><span class="me2">seconds</span><span class="br0">&#123;</span><span class="nu0">2</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; TestFunc<span class="br0">&#40;</span>executor, i <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>std<span class="sy4">::</span><span class="kw3">getchar</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6446.html</guid>
		</item>
		<item>
			<title>Еще одна задача</title>
			<link>https://www.cyberforum.ru/blogs/899942/6374.html</link>
			<pubDate>Sat, 15 Feb 2020 13:49:03 GMT</pubDate>
			<description>Еще одна задачка, которую мне пришлось решать по тем или иным обстоятельствам. Оставлю ее здесь на...</description>
			<content:encoded><![CDATA[<div>Еще одна задачка, которую мне пришлось решать по тем или иным обстоятельствам. Оставлю ее здесь на память. Приведу ее текст на английском, ибо переводить мне лень.<br />
<br />
[FIELDSET=&quot;Yet another task&quot;]You are given two arrays A and B consisting of N integers each.<br />
<br />
Index K is named <i>fair</i> if the four sums (A[0] + ... + A[K - 1]), (A[K] + ... + A[N - 1]), (B[0] + ... + B[K - 1]) and (B[K] + ... + B[N - 1]) are all equal. In other words, K is the index where the two arrays, A and B, can be split (into two non-empty arrays each) in such a way that the sums of the resulting arrays' elements are equal.<br />
<br />
For example, given arrays A = [4, -1, 0, 3] and B = [-2, 5, 0, 3], index K = 2 is <i>fair</i>. The sums of the subarrays are all equal: 4 + (-1) = 3; 0 + 3 = 3; -2 + 5 = 3 and 0 + 3 = 3. On the other hand, index K = 1 is not <i>fair</i>, the sums of the subarrays are: 4; (-1) + 0 + 3 = 2; -2 and 5 + 0 + 3 = 8.<br />
<br />
Write a function:<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="44938061"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="44938061" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw4">int</span> solution <span class="br0">&#40;</span>vector<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="sy3">&amp;</span>A, vector<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="sy3">&amp;</span>B<span class="br0">&#41;</span><span class="sy4">;</span></pre></td></tr></table></div></td></tr></tbody></table></div>which, given two arrays of integers A and B, returns the number of <i>fair</i> indexes.<br />
<br />
Examples:<ol style="list-style-type: decimal"><li>Given A = [4, -1, 0, 3] and B = [-2, 5, 0, 3], your function should return 2. The <i>fair</i> indexes are 2 and 3. In both cases, the sums of elements of the subarrays are equal to 3.</li>
<li>Given A = [2, -2, -3, 3] and B = [0, 0, 4, -4], your function should return 1. The only <i>fair</i> index is 2. Index 4 is not <i>fair</i> as the subarrays containing indexes from K to N - 1 would be empty.</li>
<li>Given A = [4, -1, 0, 3] and B = [-2, 6, 0, 4], your function should return 0. There are no <i>fair</i> indexes.</li>
<li>Given A = [3, 2, 6] and B = [4, 1, 6], your function should return 0.</li>
<li>Given A = [1, 4, 2, -2, 5], B = [7, -2, -2, 2, 5], your function should return 2. The <i>fair</i> indexes are 2 and 4.</li>
</ol><br />
Write an efficient algorithm for the following assumptions:<ul><li>N is an integer within the range [2 ... 100,000];</li>
<li>each element of arrays A, B is an integer within the range [-1,000,000,000 ... 1,000,000,000].</li>
</ul>[/FIELDSET]<br />
<br />
И вот мое решение, которое я не успел протестировать на большом количестве примеров.<br />
<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="281485173"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="281485173" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="de1"><pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="co2">#include &lt;numeric&gt;</span>
<span class="co2">#include &lt;vector&gt;</span>
&nbsp;
<span class="kw4">int</span> solution<span class="br0">&#40;</span>std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="sy3">&amp;</span> A, std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> <span class="sy3">&amp;</span> B<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>A.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> B.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Vectors<span class="es1">\'</span> sizes not equal!&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="kw4">size_t</span> size <span class="sy1">=</span> A.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>size <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Vectors<span class="es1">\'</span> sizes are zero!&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>size <span class="sy1">==</span> <span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Vectors<span class="es1">\'</span> sizes are one!&quot;</span> <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span> 
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw4">int</span> sum1A <span class="sy1">=</span> A<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">int</span> sum1B <span class="sy1">=</span> B<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">int</span> sum2A <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">accumulate</span><span class="br0">&#40;</span>A.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">+</span> <span class="nu0">1</span>, A.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">int</span> sum2B <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">accumulate</span><span class="br0">&#40;</span>B.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy2">+</span> <span class="nu0">1</span>, B.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">int</span> result <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw4">size_t</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> i <span class="sy1">&lt;</span> size<span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sum1A <span class="sy1">==</span> sum1B <span class="sy3">&amp;&amp;</span> sum2A <span class="sy1">==</span> sum2B <span class="sy3">&amp;&amp;</span> sum1A <span class="sy1">==</span> sum2A<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Result index: &quot;</span> <span class="sy1">&lt;&lt;</span> i <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; &nbsp; &nbsp; result<span class="sy2">++</span><span class="sy4">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; sum1A <span class="sy2">+</span><span class="sy1">=</span> A<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; &nbsp; sum1B <span class="sy2">+</span><span class="sy1">=</span> B<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; &nbsp; sum2A <span class="sy2">-</span><span class="sy1">=</span> A<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; &nbsp; sum2B <span class="sy2">-</span><span class="sy1">=</span> B<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw1">return</span> result<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; <span class="coMULTI">/*std::vector&lt;int&gt; A = {4, -1, 0, 3};</span>
<span class="coMULTI">&nbsp; std::vector&lt;int&gt; B = {-2, 5, 0, 3};*/</span>
&nbsp;
&nbsp; <span class="coMULTI">/*std::vector&lt;int&gt; A = {2, -2, -3, 3};</span>
<span class="coMULTI">&nbsp; std::vector&lt;int&gt; B = {0, 0, 4, -4};*/</span>
&nbsp;
&nbsp; <span class="coMULTI">/*std::vector&lt;int&gt; A = {4, -1, 0, 3};</span>
<span class="coMULTI">&nbsp; std::vector&lt;int&gt; B = {-2, 6, 0, 4};*/</span>
&nbsp;
&nbsp; <span class="coMULTI">/*std::vector&lt;int&gt; A = {3, 2, 6};</span>
<span class="coMULTI">&nbsp; std::vector&lt;int&gt; B = {4, 1, 6};*/</span>
&nbsp;
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> A <span class="sy1">=</span> <span class="br0">&#123;</span><span class="nu0">1</span>, <span class="nu0">4</span>, <span class="nu0">2</span>, <span class="sy2">-</span><span class="nu0">2</span>, <span class="nu0">5</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> B <span class="sy1">=</span> <span class="br0">&#123;</span><span class="nu0">7</span>, <span class="sy2">-</span><span class="nu0">2</span>, <span class="sy2">-</span><span class="nu0">2</span>, <span class="nu0">2</span>, <span class="nu0">5</span><span class="br0">&#125;</span><span class="sy4">;</span>
&nbsp;
&nbsp; <span class="kw4">int</span> result <span class="sy1">=</span> solution<span class="br0">&#40;</span>A, B<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Solution result: &quot;</span> <span class="sy1">&lt;&lt;</span> result <span class="sy1">&lt;&lt;</span> std<span class="sy4">::</span><span class="me2">endl</span><span class="sy4">;</span>
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6374.html</guid>
		</item>
		<item>
			<title>Ключи Valgrind</title>
			<link>https://www.cyberforum.ru/blogs/899942/6172.html</link>
			<pubDate>Tue, 19 Nov 2019 15:31:22 GMT</pubDate>
			<description>Запись в блоге, чтобы быстро найти необходимые ключи для отладки утечек памяти с помощью Valgrind...</description>
			<content:encoded><![CDATA[<div>Запись в блоге, чтобы быстро найти необходимые ключи для отладки утечек памяти с помощью <i><a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Valgrind" target="_blank" title="https://en.wikipedia.org/wiki/Valgrind">Valgrind</a></i>.<br />
<br />
Проверить на наличие <i>Debug</i>-символов:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="476331163"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="476331163" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">objdump <span class="re5">--syms</span> <span class="sy0">&lt;</span>executable<span class="sy0">&gt;</span> <span class="sy0">|</span> <span class="kw2">grep</span> debug <span class="re5">-i</span></pre></td></tr></table></div></td></tr></tbody></table></div>Запустить <i>Valgrind</i>:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="803522723"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="803522723" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw2">valgrind</span> <span class="re5">--tool</span>=memcheck <span class="re5">--leak-check</span>=full <span class="re5">--show-leak-kinds</span>=all <span class="re5">--track-origins</span>=<span class="kw2">yes</span> <span class="re5">--verbose</span> <span class="re5">--log-file</span>=valgrind-out.txt <span class="sy0">&lt;</span>executable<span class="sy0">&gt;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/6172.html</guid>
		</item>
		<item>
			<title>Разбиение диска с помощью Logical Volume Manager</title>
			<link>https://www.cyberforum.ru/blogs/899942/5764.html</link>
			<pubDate>Mon, 15 Apr 2019 11:41:08 GMT</pubDate>
			<description>Возникала у меня следующая проблема. После установки системы RHEL на машину с SSD-диском, у меня...</description>
			<content:encoded><![CDATA[<div><blockquote>Возникала у меня следующая проблема. После установки системы <i>RHEL</i> на машину с <i>SSD</i>-диском, у меня остались два <i>HDD</i>-диска, которые &quot;висят в воздухе&quot; и никак не монтированы в систему. Жалко терять целый терабайт памяти просто так. Для монтирования их в систему и дальнейшего использования я решил воспользоваться функционалом, который называется <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)" target="_blank" title="https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)">Logical Volume Manager</a>. <i>LVM</i> предоставляет дополнительный слой абстракции над железом. Например, можно объединить несколько физических дисков в группу, чтобы в дальнейшем разбить эту группу на логические &quot;диски&quot;. Этим я и займусь.</blockquote>Для начала, необходимо удалить таблицу разделов с дисков. Для этого введем следующие команды (взято из <code class="inlinecode">man pvcreate</code>):<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="366962794"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="366962794" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1"><span class="kw2">sudo</span> <span class="kw2">dd</span> <span class="re2">if</span>=<span class="sy0">/</span>dev<span class="sy0">/</span>zero <span class="re2">of</span>=<span class="sy0">/</span>dev<span class="sy0">/</span>sda <span class="re2">bs</span>=<span class="nu0">512</span> <span class="re2">count</span>=<span class="nu0">1</span>
<span class="kw2">sudo</span> <span class="kw2">dd</span> <span class="re2">if</span>=<span class="sy0">/</span>dev<span class="sy0">/</span>zero <span class="re2">of</span>=<span class="sy0">/</span>dev<span class="sy0">/</span>sdb <span class="re2">bs</span>=<span class="nu0">512</span> <span class="re2">count</span>=<span class="nu0">1</span></pre></td></tr></table></div></td></tr></tbody></table></div>Необходимо инициализировать физические устройства для использования <i>LVM</i>'ом. Определения, что такое <i>PV</i>, <i>VG</i>, <i>LV</i> и т. д. можно найти вот по <a rel="nofollow noopener noreferrer" href="http://xgu.ru/wiki/LVM" target="_blank" title="http://xgu.ru/wiki/LVM">этой ссылке</a>:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="940198956"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="940198956" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1"><span class="kw2">sudo</span> pvcreate <span class="sy0">/</span>dev<span class="sy0">/</span>sda
<span class="kw2">sudo</span> pvcreate <span class="sy0">/</span>dev<span class="sy0">/</span>sdb</pre></td></tr></table></div></td></tr></tbody></table></div>Создаем группу томов из ранее инициализированных физических томов:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="174766050"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="174766050" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw2">sudo</span> vgcreate dagestan <span class="sy0">/</span>dev<span class="sy0">/</span>sda <span class="sy0">/</span>dev<span class="sy0">/</span>sdb</pre></td></tr></table></div></td></tr></tbody></table></div>Теперь мы можем создать логические тома поверх группы, которую я назвал <i>dagestan</i>. Поскольку я не обладаю большой фантазией, я буду называть все логические тома в честь 10 городов, расположенных в Дагестане:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="341292342"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="341292342" style="height: 190px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="de1"><pre class="de1"><span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> makhachkala dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> buynaksk dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> dagestanskiye_ogni dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> derbent dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> izberbash dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> kaspiysk dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> kizilyurt dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> kizlyar dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">10</span><span class="sy0">%</span>VG <span class="re5">-n</span> khasavyurt dagestan
<span class="kw2">sudo</span> lvcreate <span class="re5">-l</span> <span class="nu0">100</span><span class="sy0">%</span>FREE <span class="re5">-n</span> yuzhno_sukhokumsk dagestan</pre></td></tr></table></div></td></tr></tbody></table></div>Команда <code class="inlinecode">sudo lvscan</code> покажет нечто подобное:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="387453211"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="387453211" style="height: 238px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="de1"><pre class="de1">ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/rhel/swap' <span class="br0">&#91;</span><span class="nu0">7.81</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/rhel/home' <span class="br0">&#91;</span><span class="nu0">179.46</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/rhel/root' <span class="br0">&#91;</span><span class="nu0">50.00</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/makhachkala' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/buynaksk' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/dagestanskiye_ogni' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/derbent' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/izberbash' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/kaspiysk' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/kizilyurt' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/kizlyar' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/khasavyurt' <span class="br0">&#91;</span>&lt;<span class="nu0">93.15</span> GiB<span class="br0">&#93;</span> inherit
ACTIVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'/dev/dagestan/yuzhno_sukhokumsk' <span class="br0">&#91;</span>&lt;<span class="nu0">93.18</span> GiB<span class="br0">&#93;</span> inherit</pre></td></tr></table></div></td></tr></tbody></table></div>Создаем файловые системы на всех логических томах. Я выбрал файловую систему <i>XFS</i>, так как сам установщик <i>RHEL</i>'а автоматически выбрал ее для своего раздела. А как я могу спорить с выбором компании, в которой работает сам Поттеринг:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="338123116"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="338123116" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1"><span class="kw1">for</span> lv <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">ls</span> <span class="sy0">/</span>dev<span class="sy0">/</span>dagestan<span class="sy0">`</span>; <span class="kw1">do</span> <span class="kw2">sudo</span> mkfs.xfs <span class="sy0">/</span>dev<span class="sy0">/</span>dagestan<span class="sy0">/</span><span class="re1">$lv</span>; <span class="kw1">done</span></pre></td></tr></table></div></td></tr></tbody></table></div>Осталось теперь все это дело примонтировать и пользоваться:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="180622472"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="180622472" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1"><span class="kw3">cd</span> ~
<span class="kw2">mkdir</span> <span class="kw2">mount</span>
<span class="kw3">cd</span> .<span class="sy0">/</span><span class="kw2">mount</span>
<span class="kw1">for</span> lv <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">ls</span> <span class="sy0">/</span>dev<span class="sy0">/</span>dagestan<span class="sy0">`</span>; <span class="kw1">do</span> <span class="kw2">mkdir</span> <span class="re1">$lv</span>; <span class="kw1">done</span>
<span class="kw1">for</span> lv <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">ls</span> <span class="sy0">/</span>dev<span class="sy0">/</span>dagestan<span class="sy0">`</span>; <span class="kw1">do</span> <span class="kw2">sudo</span> <span class="kw2">mount</span> <span class="sy0">/</span>dev<span class="sy0">/</span>dagestan<span class="sy0">/</span><span class="re1">$lv</span> <span class="re1">$lv</span>; <span class="kw1">done</span>
<span class="kw1">for</span> lv <span class="kw1">in</span> <span class="sy0">`</span><span class="kw2">ls</span><span class="sy0">`</span>; <span class="kw1">do</span> <span class="kw2">sudo</span> <span class="kw2">chown</span> <span class="sy0">&lt;</span>user<span class="sy0">&gt;</span>:<span class="sy0">&lt;</span>group<span class="sy0">&gt;</span> <span class="re1">$lv</span>; <span class="kw1">done</span></pre></td></tr></table></div></td></tr></tbody></table></div>Команда <code class="inlinecode">lsblk -f</code> покажет нечто подобное:<br />
<div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="404076705"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="404076705" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="de1"><pre class="de1">NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FSTYPE &nbsp; &nbsp; &nbsp;LABEL UUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MOUNTPOINT
sda &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LVM2_member &nbsp; &nbsp; &nbsp; VNqq1O-78js-Ry5W-h0qG-ukL4-ro0h-LtD9A4 
├─dagestan-makhachkala &nbsp; &nbsp; &nbsp; &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e882aaf2-d903-4ac9-8d32-3558fe03be3e &nbsp; /home/g.freeman/mount/makhachkala
├─dagestan-buynaksk &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8afef053-dc2e-4d2f-bdbc-36394110f79e &nbsp; /home/g.freeman/mount/buynaksk
├─dagestan-dagestanskiye_ogni xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7776ccde-29ce-437b-93a0-4d2033e45457 &nbsp; /home/g.freeman/mount/dagestanskiye_ogni
├─dagestan-derbent &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 66a94c01-e559-44a0-<span class="nu0">8240</span>-38b325ac8e5b &nbsp; /home/g.freeman/mount/derbent
├─dagestan-izberbash &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b18ec2a9-0c52-4e2f-b1ff-a41706001a10 &nbsp; /home/g.freeman/mount/izberbash
└─dagestan-yuzhno_sukhokumsk &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0bd3eab8-9c8c-4fee-a3ed-10f89bb3f002 &nbsp; /home/g.freeman/mount/yuzhno_sukhokumsk
sdb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LVM2_member &nbsp; &nbsp; &nbsp; GLlVam-Q6j9-t1Mp-p1mC-heAS-Fets-NctIzK 
├─dagestan-kaspiysk &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1d3e4080-247d-475c-bb8a-dbc10eea1d04 &nbsp; /home/g.freeman/mount/kaspiysk
├─dagestan-kizilyurt &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0b3c13c2-ddd5-4c0c-a927-73a436120e39 &nbsp; /home/g.freeman/mount/kizilyurt
├─dagestan-kizlyar &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 898c8a79-ca6b-428e-9e73-e9b3befc7ab7 &nbsp; /home/g.freeman/mount/kizlyar
├─dagestan-khasavyurt &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abd084c6-99d5-44d4-b95f-f529cbae12bf &nbsp; /home/g.freeman/mount/khasavyurt
└─dagestan-yuzhno_sukhokumsk &nbsp;xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0bd3eab8-9c8c-4fee-a3ed-10f89bb3f002 &nbsp; /home/g.freeman/mount/yuzhno_sukhokumsk
sr0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
nvme0n1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
├─nvme0n1p1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vfat &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="nu0">1447</span>-D6E6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/boot/efi
├─nvme0n1p2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3b714d31-5fa4-4b85-99fb-74df773a4900 &nbsp; /boot
└─nvme0n1p3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LVM2_member &nbsp; &nbsp; &nbsp; ASSIMZ-37G8-nyAq-gHrU-GQuh-XWQd-z0mICk 
&nbsp; ├─rhel-root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d33e45ed-b61d-<span class="nu0">4039</span>-9b40-f4b0d2fca200 &nbsp; /
&nbsp; ├─rhel-swap &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; swap &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;522aff90-569a-4eaf-87cf-1b2c910a74c1 &nbsp; <span class="br0">&#91;</span>SWAP<span class="br0">&#93;</span>
&nbsp; └─rhel-home &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e0442515-64e1-4cb6-9c9a-551239a94452 &nbsp; /home</pre></td></tr></table></div></td></tr></tbody></table></div>Желательно также настроить автомонтирование при загрузке системы. Это можно сделать через либо через файл <i>/etc/fstab</i>, либо через <i>systemd</i>. Но об этом я уже тут писать не буду.</div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/5764.html</guid>
		</item>
		<item>
			<title>Шпаргалка по openssl</title>
			<link>https://www.cyberforum.ru/blogs/899942/5735.html</link>
			<pubDate>Thu, 21 Mar 2019 11:38:39 GMT</pubDate>
			<description>OpenSSL (https://en.wikipedia.org/wiki/OpenSSL) - это инструмент, который позволяет проводить...</description>
			<content:encoded><![CDATA[<div><a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/OpenSSL" target="_blank" title="https://en.wikipedia.org/wiki/OpenSSL">OpenSSL</a> - это инструмент, который позволяет проводить большинство криптографических операций, в числе которых шифрование, цифровая подпись, генерация сертификатов и т. д. Данный инструмент имеет непосредственно саму утилиту <i>openssl</i> и API, которое представлено в библиотеках <i>libcrypto</i>, которая содержит реализации общих криптографических операций, и <i>libssl</i>, которая содержит реализацию протоколов <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Transport_Layer_Security" target="_blank" title="https://en.wikipedia.org/wiki/Transport_Layer_Security">SSL/TLS</a>.<br />
<br />
В данной записи я напишу те команды утилиты <i>openssl</i>, которые на данный момент могут оказаться для меня полезными и чтобы я мог быстро вспомнить, как выполнить ту или иную операцию. Если в будущем я обнаружу команды, которые мне будут интересы, я буду ими дополнять данную запись.<br />
<br />
Генерация связки приватный/публичный <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)" target="_blank" title="https://en.wikipedia.org/wiki/RSA_(cryptosystem)">RSA</a> ключ:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="712127633"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="712127633" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl genpkey <span class="re5">-algorithm</span> rsa <span class="re5">-pkeyopt</span> rsa_keygen_bits:<span class="nu0">1024</span> <span class="re5">-pkeyopt</span> rsa_keygen_pubexp:<span class="nu0">65537</span> <span class="re5">-out</span> .<span class="sy0">/</span>rsa_private_key.pem</pre></td></tr></table></div></td></tr></tbody></table></div>Получение публичного ключа из связки приватный/публичный ключ:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="879190245"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="879190245" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl pkey <span class="re5">-in</span> .<span class="sy0">/</span>rsa_private_key.pem <span class="re5">-pubout</span> <span class="re5">-out</span> .<span class="sy0">/</span>rsa_public_key.pem</pre></td></tr></table></div></td></tr></tbody></table></div>Шифрование сообщения:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="132585751"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="132585751" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1"><span class="kw2">touch</span> message.txt
<span class="kw3">echo</span> Hello World<span class="sy0">!</span> <span class="sy0">&gt;</span> .<span class="sy0">/</span>message.txt
openssl pkeyutl <span class="re5">-encrypt</span> <span class="re5">-in</span> .<span class="sy0">/</span>message.txt <span class="re5">-inkey</span> .<span class="sy0">/</span>rsa_public_key.pem <span class="re5">-pubin</span> <span class="re5">-out</span> .<span class="sy0">/</span>encrypted_text.bin</pre></td></tr></table></div></td></tr></tbody></table></div>Расшифровка сообщения:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="137418192"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="137418192" style="height: 62px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
</pre></td><td class="de1"><pre class="de1">openssl pkeyutl <span class="re5">-decrypt</span> <span class="re5">-in</span> .<span class="sy0">/</span>encrypted_text.bin <span class="re5">-inkey</span> .<span class="sy0">/</span>rsa_private_key.pem <span class="re5">-out</span> .<span class="sy0">/</span>decrypted_text.txt
<span class="kw2">cat</span> .<span class="sy0">/</span>decrypted_text.txt</pre></td></tr></table></div></td></tr></tbody></table></div>Создание цифровой подписи:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="335353494"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="335353494" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl dgst <span class="re5">-sha256</span> <span class="re5">-sign</span> .<span class="sy0">/</span>rsa_private_key.pem <span class="re5">-out</span> .<span class="sy0">/</span>signature.bin .<span class="sy0">/</span>message.txt</pre></td></tr></table></div></td></tr></tbody></table></div>Проверка подлинности цифровой подписи:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="350720334"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="350720334" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl dgst <span class="re5">-sha256</span> <span class="re5">-verify</span> .<span class="sy0">/</span>rsa_public_key.pem <span class="re5">-signature</span> .<span class="sy0">/</span>signature.bin .<span class="sy0">/</span>message.txt</pre></td></tr></table></div></td></tr></tbody></table></div>Создание цифровой подписи без применения хеш-функции. Хотя не знаю, можно ли назвать это цифровой подписью, но, как я это понял,<br />
<i>openssl</i> позволяет это сделать. Скорее, я бы назвал это просто шифрованием сообщения приватным ключем:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="835128846"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="835128846" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl pkeyutl <span class="re5">-sign</span> <span class="re5">-inkey</span> .<span class="sy0">/</span>rsa_private_key.pem <span class="re5">-in</span> .<span class="sy0">/</span>message.txt <span class="re5">-out</span> .<span class="sy0">/</span>rsa_signature.bin</pre></td></tr></table></div></td></tr></tbody></table></div>Проверка подлинности &quot;цифровой подписи&quot; без применения хеш-функции:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="28879921"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="28879921" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">openssl pkeyutl <span class="re5">-verify</span> <span class="re5">-inkey</span> .<span class="sy0">/</span>rsa_public_key.pem <span class="re5">-pubin</span> <span class="re5">-sigfile</span> .<span class="sy0">/</span>rsa_signature.bin <span class="re5">-in</span> .<span class="sy0">/</span>message.txt</pre></td></tr></table></div></td></tr></tbody></table></div>Создание корневого <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Public_key_certificate" target="_blank" title="https://en.wikipedia.org/wiki/Public_key_certificate">сертификата</a>, промежуточного сертификата и контейнера <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/PKCS_12" target="_blank" title="https://en.wikipedia.org/wiki/PKCS_12">PKCS #12</a>:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="269538282"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="269538282" style="height: 110px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
</pre></td><td class="de1"><pre class="de1">openssl req <span class="re5">-new</span> <span class="re5">-x509</span> <span class="re5">-days</span> <span class="nu0">3650</span> <span class="re5">-key</span> .<span class="sy0">/</span>rsa_private_key.pem <span class="re5">-out</span> .<span class="sy0">/</span>ca.crt
openssl genpkey <span class="re5">-algorithm</span> rsa <span class="re5">-out</span> .<span class="sy0">/</span>ia_private_key.pem <span class="nu0">1024</span>
openssl req <span class="re5">-new</span> <span class="re5">-key</span> .<span class="sy0">/</span>ia_private_key.pem <span class="re5">-out</span> .<span class="sy0">/</span>ia.csr
openssl x509 <span class="re5">-req</span> <span class="re5">-days</span> <span class="nu0">3650</span> <span class="re5">-in</span> .<span class="sy0">/</span>ia.csr <span class="re5">-CA</span> .<span class="sy0">/</span>ca.crt <span class="re5">-CAkey</span> .<span class="sy0">/</span>rsa_private_key.pem -set_serial 01 <span class="re5">-out</span> .<span class="sy0">/</span>ia.crt
openssl pkcs12 <span class="re5">-export</span> <span class="re5">-out</span> .<span class="sy0">/</span>ia.p12 <span class="re5">-inkey</span> .<span class="sy0">/</span>ia_private_key.pem <span class="re5">-in</span> .<span class="sy0">/</span>ia.crt <span class="re5">-chain</span> <span class="re5">-CAfile</span> .<span class="sy0">/</span>ca.crt</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/5735.html</guid>
		</item>
		<item>
			<title>Первые шаги на C#</title>
			<link>https://www.cyberforum.ru/blogs/899942/5642.html</link>
			<pubDate>Thu, 24 Jan 2019 14:55:01 GMT</pubDate>
			<description>С недавнего времени решил изучить такой замечательный язык программирования, как C#. После C++ и...</description>
			<content:encoded><![CDATA[<div>С недавнего времени решил изучить такой замечательный язык программирования, как C#. После C++ и мучений с системами сборки и с зависимостями C# кажется просто идеальным. Как известно, лучше всего что-то учить, применяя это на практике, решая реальные задачи.<br />
<br />
Недавно мне понадобилась утилита для анализа звуковых файлов в формате <a rel="nofollow noopener noreferrer" href="http://soundfile.sapp.org/doc/WaveFormat/" target="_blank" title="http://soundfile.sapp.org/doc/WaveFormat/"><i>wav</i></a>. Утилита просто выводит содержимое заголовка wav-файла в стандартный поток вывода. Для разработки я также использовал <i>NuGet</i>-пакет <a rel="nofollow noopener noreferrer" href="https://github.com/commandlineparser/commandline" target="_blank" title="https://github.com/commandlineparser/commandline">CommandLineParser</a>.Оставляю код здесь, чтобы не потерять его.<br />
<br />
<div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="895272637"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="895272637" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="de1"><pre class="de1"><span class="kw1">using</span> <span class="co3">CommandLine</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Collections.Generic</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">namespace</span> WaveReader
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">sealed</span> <span class="kw4">class</span> Program
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">sealed</span> <span class="kw4">class</span> Options
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span><span class="kw1">Value</span><span class="br0">&#40;</span><span class="nu0">0</span>, Required <span class="sy0">=</span> <span class="kw1">true</span>, HelpText <span class="sy0">=</span> <span class="st0">&quot;List of input files&quot;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> IEnumerable<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> FilePaths <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> Main<span class="br0">&#40;</span><span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> waveFilePaths <span class="sy0">=</span> <span class="kw3">new</span> List<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Parser<span class="sy0">.</span><span class="kw1">Default</span><span class="sy0">.</span><span class="me1">ParseArguments</span><span class="sy0">&lt;</span>Options<span class="sy0">&gt;</span><span class="br0">&#40;</span>args<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">WithParsed</span><span class="br0">&#40;</span>option <span class="sy0">=&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> filePath <span class="kw1">in</span> option<span class="sy0">.</span><span class="me1">FilePaths</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; waveFilePaths<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>filePath<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WaveParser waveParser <span class="sy0">=</span> <span class="kw3">new</span> WaveParser<span class="br0">&#40;</span>waveFilePaths<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; waveParser<span class="sy0">.</span><span class="me1">Parse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="437891512"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="437891512" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
</pre></td><td class="de1"><pre class="de1"><span class="kw1">using</span> <span class="co3">System</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Collections.Generic</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.IO</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">namespace</span> WaveReader
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw1">sealed</span> <span class="kw4">class</span> WaveParser
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> WaveParser<span class="br0">&#40;</span>List<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> waveFilePaths<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _waveFilePath <span class="sy0">=</span> waveFilePaths<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> Parse<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>CheckFilesExist<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> waveFilePath <span class="kw1">in</span> _waveFilePath<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileStream waveFileStream <span class="sy0">=</span> <span class="kw3">new</span> FileStream<span class="br0">&#40;</span>waveFilePath, FileMode<span class="sy0">.</span><span class="me1">Open</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BinaryReader waveFileBinaryReader <span class="sy0">=</span> <span class="kw3">new</span> BinaryReader<span class="br0">&#40;</span>waveFileStream<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WaveHeader waveHeader <span class="sy0">=</span> <span class="kw3">new</span> WaveHeader<span class="br0">&#40;</span>waveFileBinaryReader<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ContentPrinter<span class="br0">&#40;</span>waveFilePath, waveHeader<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">ReadLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span>Exception exception<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>exception<span class="sy0">.</span><span class="me1">Message</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">bool</span> CheckFilesExist<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>_waveFilePath<span class="sy0">.</span><span class="me1">Count</span> <span class="sy0">!=</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> waveFilePath <span class="kw1">in</span> _waveFilePath<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>File<span class="sy0">.</span><span class="me1">Exists</span><span class="br0">&#40;</span>waveFilePath<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;File <span class="es0">\&quot;</span>{0}<span class="es0">\&quot;</span> does not exist!&quot;</span>, waveFilePath<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;List of files is empty!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">false</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">true</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">void</span> ContentPrinter<span class="br0">&#40;</span><span class="kw4">string</span> waveFilePath, WaveHeader waveHeader<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;+++++&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>$<span class="st0">&quot;File: {waveFilePath}&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;+++++&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>$<span class="st0">&quot;Header content: {waveHeader}&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="st0">&quot;-----&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">readonly</span> List<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> _waveFilePath<span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="363169458"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="363169458" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
</pre></td><td class="de1"><pre class="de1"><span class="kw1">using</span> <span class="co3">System.IO</span><span class="sy0">;</span>
<span class="kw1">using</span> <span class="co3">System.Text</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">namespace</span> WaveReader
<span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw1">sealed</span> <span class="kw4">class</span> WaveHeader
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> WaveHeader<span class="br0">&#40;</span>BinaryReader waveBinaryReader<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _riffChunkDescriptor <span class="sy0">=</span> <span class="kw3">new</span> RiffChunkDescriptor
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ChunkID <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadBytes</span><span class="br0">&#40;</span>TEXT_SIZE<span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ChunkSize <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt32</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Format <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadBytes</span><span class="br0">&#40;</span>TEXT_SIZE<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _fmtSubChunk <span class="sy0">=</span> <span class="kw3">new</span> FmtSubChunk
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Subchunk1ID <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadBytes</span><span class="br0">&#40;</span>TEXT_SIZE<span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Subchunk1Size <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt32</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AudioFormat <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt16</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NumChannels <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt16</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SampleRate <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt32</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteRate <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt32</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BlockAlign <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt16</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BitsPerSample <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt16</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _dataSubChunk <span class="sy0">=</span> <span class="kw3">new</span> DataSubChunk
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Subchunk2ID <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadBytes</span><span class="br0">&#40;</span>TEXT_SIZE<span class="br0">&#41;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Subchunk2Size <span class="sy0">=</span> waveBinaryReader<span class="sy0">.</span><span class="me1">ReadUInt32</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> $<span class="st0">&quot;{_riffChunkDescriptor} {_fmtSubChunk} {_dataSubChunk}&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw4">struct</span> RiffChunkDescriptor
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> ChunkID <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">uint</span> ChunkSize <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> Format <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> $<span class="st0">&quot;<span class="es0">\n</span>ChunkID = {Encoding.UTF8.GetString(ChunkID)} <span class="es0">\n</span>ChunkSize = {ChunkSize} <span class="es0">\n</span>Format = {Encoding.UTF8.GetString(Format)}<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw4">struct</span> FmtSubChunk
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> Subchunk1ID <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">uint</span> Subchunk1Size <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">ushort</span> AudioFormat <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">ushort</span> NumChannels <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">uint</span> SampleRate <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">uint</span> ByteRate <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">ushort</span> BlockAlign <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">ushort</span> BitsPerSample <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> part1 <span class="sy0">=</span> $<span class="st0">&quot;<span class="es0">\n</span>Subchunk1ID = {Encoding.UTF8.GetString(Subchunk1ID)} <span class="es0">\n</span>Subchunk1Size = {Subchunk1Size} <span class="es0">\n</span>AudioFormat = {AudioFormat} <span class="es0">\n</span>NumChannels = {NumChannels}&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> part2 <span class="sy0">=</span> $<span class="st0">&quot;<span class="es0">\n</span>SampleRate = {SampleRate} <span class="es0">\n</span>ByteRate = {ByteRate} <span class="es0">\n</span>BlockAlign = {BlockAlign} <span class="es0">\n</span>BitsPerSample = {BitsPerSample}<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> part1 <span class="sy0">+</span> part2<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">internal</span> <span class="kw4">struct</span> DataSubChunk
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span> Subchunk2ID <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">uint</span> Subchunk2Size <span class="br0">&#123;</span> <span class="kw1">get</span><span class="sy0">;</span> <span class="kw1">set</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">string</span> ToString<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> $<span class="st0">&quot;<span class="es0">\n</span>Subchunk2ID = {Encoding.UTF8.GetString(Subchunk2ID)} <span class="es0">\n</span>Subchunk2Size = {Subchunk2Size}&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">const</span> <span class="kw4">int</span> TEXT_SIZE <span class="sy0">=</span> <span class="nu0">4</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">readonly</span> RiffChunkDescriptor _riffChunkDescriptor<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">readonly</span> FmtSubChunk _fmtSubChunk<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">readonly</span> DataSubChunk _dataSubChunk<span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/5642.html</guid>
		</item>
		<item>
			<title>API для работы с ВКонтакте</title>
			<link>https://www.cyberforum.ru/blogs/899942/5486.html</link>
			<pubDate>Fri, 12 Oct 2018 13:38:26 GMT</pubDate>
			<description><![CDATA[Очередной говно-скрипт на Python'е, выложенный здесь, чтобы он не потерялся. В теории, можно было...]]></description>
			<content:encoded><![CDATA[<div>Очередной говно-скрипт на <i>Python</i>'е, выложенный здесь, чтобы он не потерялся. В теории, можно было бы выкладывать код на <i>GitHub</i>'е, но я считаю, что там надо выкладывать только что-то стоящее и то, что будет поддерживаться и иметь жизненный цикл.<br />
<br />
Скрипт нужен, чтобы сгруппировать друзей заданного пользователя по городам. Также, скрипт выводит друзей друзей из определенного города, если они есть в списке заданного пользователя.<br />
<div class="codeblock"><table class="python"><thead><tr><td colspan="2" id="139034198"  class="head">Python</td></tr></thead><tbody><tr class="li1"><td><div id="139034198" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
</pre></td><td class="de1"><pre class="de1"><span class="kw1">import</span> <span class="kw3">getpass</span>
<span class="kw1">import</span> <span class="kw3">pprint</span>
<span class="kw1">import</span> vk_api
&nbsp;
<span class="kw1">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>:
&nbsp; &nbsp; login <span class="sy0">=</span> <span class="kw2">input</span><span class="br0">&#40;</span><span class="st0">&quot;Login: &quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; password <span class="sy0">=</span> <span class="kw3">getpass</span>.<span class="kw3">getpass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="co1">#print(password)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1"># ===== get_api =====</span>
&nbsp; &nbsp; vk_session <span class="sy0">=</span> vk_api.<span class="me1">VkApi</span><span class="br0">&#40;</span>login<span class="sy0">,</span> password<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">try</span>:
&nbsp; &nbsp; &nbsp; &nbsp; vk_session.<span class="me1">auth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">except</span> vk_api.<span class="me1">AuthError</span> <span class="kw1">as</span> error_msg:
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span>error_msg<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>
&nbsp; &nbsp; vk <span class="sy0">=</span> vk_session.<span class="me1">get_api</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="co1"># ===== get_api =====</span>
&nbsp;
&nbsp; &nbsp; main_user_id <span class="sy0">=</span> <span class="kw2">input</span><span class="br0">&#40;</span><span class="st0">&quot;main_user_id: &quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; main_user <span class="sy0">=</span> vk.<span class="me1">users</span>.<span class="me1">get</span><span class="br0">&#40;</span>user_ids <span class="sy0">=</span> main_user_id<span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">'main_user: '</span><span class="sy0">,</span> main_user<span class="br0">&#41;</span>
&nbsp; &nbsp; friends_of_main_user_ids_list <span class="sy0">=</span> vk.<span class="me1">friends</span>.<span class="me1">get</span><span class="br0">&#40;</span>user_id <span class="sy0">=</span> main_user_id<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; friends_of_main_user_ids <span class="sy0">=</span> <span class="st0">','</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="kw2">map</span><span class="br0">&#40;</span><span class="kw2">str</span><span class="sy0">,</span> friends_of_main_user_ids_list<span class="br0">&#91;</span><span class="st0">'items'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; friends_of_main_user <span class="sy0">=</span> vk.<span class="me1">users</span>.<span class="me1">get</span><span class="br0">&#40;</span>user_ids <span class="sy0">=</span> friends_of_main_user_ids<span class="sy0">,</span> fields <span class="sy0">=</span> <span class="st0">'city'</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="co1">#print(friends_of_main_user)</span>
&nbsp;
&nbsp; &nbsp; city_user_dict <span class="sy0">=</span> <span class="kw2">dict</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">for</span> friend <span class="kw1">in</span> friends_of_main_user:
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> friend.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">'city'</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">None</span>:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; city <span class="sy0">=</span> friend<span class="br0">&#91;</span><span class="st0">'city'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">'title'</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>city_user_dict.<span class="me1">get</span><span class="br0">&#40;</span>city<span class="br0">&#41;</span> <span class="sy0">==</span> <span class="kw2">None</span><span class="br0">&#41;</span>:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; city_user_dict<span class="br0">&#91;</span>city<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newdict <span class="sy0">=</span> <span class="br0">&#123;</span>key : friend<span class="br0">&#91;</span>key<span class="br0">&#93;</span> <span class="kw1">for</span> key <span class="kw1">in</span> <span class="br0">&#91;</span><span class="st0">'id'</span><span class="sy0">,</span> <span class="st0">'first_name'</span><span class="sy0">,</span> <span class="st0">'last_name'</span><span class="br0">&#93;</span><span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; city_user_dict<span class="br0">&#91;</span>city<span class="br0">&#93;</span>.<span class="me1">append</span><span class="br0">&#40;</span>newdict<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newdict <span class="sy0">=</span> <span class="br0">&#123;</span>key : friend<span class="br0">&#91;</span>key<span class="br0">&#93;</span> <span class="kw1">for</span> key <span class="kw1">in</span> <span class="br0">&#91;</span><span class="st0">'id'</span><span class="sy0">,</span> <span class="st0">'first_name'</span><span class="sy0">,</span> <span class="st0">'last_name'</span><span class="br0">&#93;</span><span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; city_user_dict<span class="br0">&#91;</span>city<span class="br0">&#93;</span>.<span class="me1">append</span><span class="br0">&#40;</span>newdict<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw3">pprint</span>.<span class="kw3">pprint</span><span class="br0">&#40;</span>city_user_dict<span class="br0">&#41;</span>
&nbsp; &nbsp; main_city <span class="sy0">=</span> <span class="kw2">input</span><span class="br0">&#40;</span><span class="st0">&quot;main_city: &quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>city_user_dict.<span class="me1">get</span><span class="br0">&#40;</span>main_city<span class="br0">&#41;</span> <span class="sy0">==</span> <span class="kw2">None</span><span class="br0">&#41;</span>:
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;City is not exist!&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>
&nbsp; &nbsp; main_city_user_ids <span class="sy0">=</span> <span class="kw2">set</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">for</span> friend <span class="kw1">in</span> city_user_dict<span class="br0">&#91;</span>main_city<span class="br0">&#93;</span>:
&nbsp; &nbsp; &nbsp; &nbsp; main_city_user_ids.<span class="me1">add</span><span class="br0">&#40;</span>friend<span class="br0">&#91;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;main_user friends from main_city:&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="kw3">pprint</span>.<span class="kw3">pprint</span><span class="br0">&#40;</span>city_user_dict<span class="br0">&#91;</span>main_city<span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; <span class="co1">#print(main_city_user_ids)</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> friend <span class="kw1">in</span> city_user_dict<span class="br0">&#91;</span>main_city<span class="br0">&#93;</span>:
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;user: &quot;</span><span class="sy0">,</span> friend<span class="br0">&#91;</span><span class="st0">&quot;first_name&quot;</span><span class="br0">&#93;</span><span class="sy0">,</span> friend<span class="br0">&#91;</span><span class="st0">&quot;last_name&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; friends_of_main_user_friend_ids_list <span class="sy0">=</span> vk.<span class="me1">friends</span>.<span class="me1">get</span><span class="br0">&#40;</span>user_id <span class="sy0">=</span> friend<span class="br0">&#91;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> vk_api.<span class="me1">VkApiError</span> <span class="kw1">as</span> error_msg:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span>error_msg<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print(friend_ids_of_main_user_friend)</span>
&nbsp; &nbsp; &nbsp; &nbsp; friends_of_main_user_friend_ids <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> friend_id_of_friend <span class="kw1">in</span> friends_of_main_user_friend_ids_list<span class="br0">&#91;</span><span class="st0">'items'</span><span class="br0">&#93;</span>:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> friend_id_of_friend <span class="kw1">in</span> main_city_user_ids:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; friends_of_main_user_friend_ids +<span class="sy0">=</span> <span class="kw2">str</span><span class="br0">&#40;</span>friend_id_of_friend<span class="br0">&#41;</span> + <span class="st0">','</span>
&nbsp; &nbsp; &nbsp; &nbsp; friends_of_main_user_friend_ids <span class="sy0">=</span> friends_of_main_user_friend_ids<span class="br0">&#91;</span>:-<span class="nu0">1</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">pprint</span>.<span class="kw3">pprint</span><span class="br0">&#40;</span>vk.<span class="me1">users</span>.<span class="me1">get</span><span class="br0">&#40;</span>user_ids <span class="sy0">=</span> friends_of_main_user_friend_ids<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="kw1">if</span> __name__ <span class="sy0">==</span> <span class="st0">'__main__'</span>:
&nbsp; &nbsp; main<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/5486.html</guid>
		</item>
		<item>
			<title>Знакомство с FUSE</title>
			<link>https://www.cyberforum.ru/blogs/899942/5474.html</link>
			<pubDate>Sun, 30 Sep 2018 15:06:54 GMT</pubDate>
			<description>FUSE - это свободный модуль для ядер UNIX-подобных операционных систем, позволяющий разработчикам...</description>
			<content:encoded><![CDATA[<div>FUSE - это свободный модуль для ядер UNIX-подобных операционных систем, позволяющий разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий (в первую очередь - создание виртуальных файловых систем). Более подробно можно почитать <a rel="nofollow noopener noreferrer" href="https://en.wikipedia.org/wiki/Filesystem_in_Userspace" target="_blank" title="https://en.wikipedia.org/wiki/Filesystem_in_Userspace">здесь</a> и <a rel="nofollow noopener noreferrer" href="https://www.kernel.org/doc/Documentation/filesystems/fuse.txt" target="_blank" title="https://www.kernel.org/doc/Documentation/filesystems/fuse.txt">здесь</a>.<br />
<br />
Сам я не стал очень глубоко погружаться в изучение данной темы. Просто стало интересно, как можно реализовывать собственные файловые системы, хоть и виртуальные. Ниже приведен код супер тривиальной файловой системы, чтобы в будущем я мог быстро вспомнить, как работать с FUSE.<br />
<div class="codeblock"><table class="cpp"><thead><tr><td colspan="2" id="48299006"  class="head">C++</td></tr></thead><tbody><tr class="li1"><td><div id="48299006" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
</pre></td><td class="de1"><pre class="de1"><span class="co2">#define FUSE_USE_VERSION 30</span>
&nbsp;
<span class="co2">#include &lt;cstdio&gt;</span>
<span class="co2">#include &lt;cstring&gt;</span>
<span class="co2">#include &lt;ctime&gt;</span>
<span class="co2">#include &lt;fuse.h&gt;</span>
<span class="co2">#include &lt;unistd.h&gt;</span>
&nbsp;
<span class="kw4">static</span> <span class="kw4">int</span> my_getattr<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> path, <span class="kw4">struct</span> stat<span class="sy2">*</span> st<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; std<span class="sy4">::</span><span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;[getattr] Called<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Attributes of path <span class="es1">\&quot;</span>%s<span class="es1">\&quot;</span> requested<span class="es1">\n</span>&quot;</span>, path<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="kw3">memset</span><span class="br0">&#40;</span>st, <span class="nu0">0</span>, <span class="kw3">sizeof</span><span class="br0">&#40;</span><span class="kw4">struct</span> stat<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; 
&nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_uid <span class="sy1">=</span> getuid<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_gid <span class="sy1">=</span> getgid<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_atime <span class="sy1">=</span> std<span class="sy4">::</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_mtime <span class="sy1">=</span> std<span class="sy4">::</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; 
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw3">strcmp</span><span class="br0">&#40;</span>path, <span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_mode <span class="sy1">=</span> S_IFDIR <span class="sy3">|</span> <span class="nu8">0755</span><span class="sy4">;</span>
&nbsp; &nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_nlink <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">else</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_mode <span class="sy1">=</span> S_IFREG <span class="sy3">|</span> <span class="nu8">0644</span><span class="sy4">;</span>
&nbsp; &nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_nlink <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
&nbsp; &nbsp; st<span class="sy2">-</span><span class="sy1">&gt;</span>st_size <span class="sy1">=</span> <span class="nu0">1024</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">static</span> <span class="kw4">int</span> my_readdir<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> path,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span><span class="sy2">*</span> buffer,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fuse_fill_dir_t filler,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; off_t offset,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> fuse_file_info<span class="sy2">*</span> fi<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>offset<span class="sy4">;</span>
&nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>fi<span class="sy4">;</span>
&nbsp; std<span class="sy4">::</span><span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;--&gt; Getting The List of Files of path <span class="es1">\&quot;</span>%s<span class="es1">\&quot;</span><span class="es1">\n</span>&quot;</span>, path<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; 
&nbsp; filler<span class="br0">&#40;</span>buffer, <span class="st0">&quot;.&quot;</span>, <span class="kw2">nullptr</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; filler<span class="br0">&#40;</span>buffer, <span class="st0">&quot;..&quot;</span>, <span class="kw2">nullptr</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; 
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw3">strcmp</span><span class="br0">&#40;</span>path, <span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; filler<span class="br0">&#40;</span>buffer, <span class="st0">&quot;file1&quot;</span>, <span class="kw2">nullptr</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; &nbsp; filler<span class="br0">&#40;</span>buffer, <span class="st0">&quot;file2&quot;</span>, <span class="kw2">nullptr</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; 
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">static</span> <span class="kw4">int</span> my_read<span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> path,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">char</span><span class="sy2">*</span> buffer,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">size_t</span> size,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;off_t offset,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">struct</span> fuse_file_info<span class="sy2">*</span> fi<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; <span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>fi<span class="sy4">;</span>
&nbsp; <span class="kw4">char</span> file1Text <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">&quot;Hello World From File1!<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">char</span> file2Text <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy1">=</span> <span class="st0">&quot;Hello World From File2!<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
&nbsp; <span class="kw4">char</span><span class="sy2">*</span> selectedText <span class="sy1">=</span> <span class="kw2">nullptr</span><span class="sy4">;</span>
&nbsp; 
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw3">strcmp</span><span class="br0">&#40;</span>path, <span class="st0">&quot;/file1&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; selectedText <span class="sy1">=</span> file1Text<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw3">strcmp</span><span class="br0">&#40;</span>path, <span class="st0">&quot;/file2&quot;</span><span class="br0">&#41;</span> <span class="sy1">==</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; selectedText <span class="sy1">=</span> file2Text<span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; <span class="kw1">else</span>
&nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="sy2">-</span><span class="nu0">1</span><span class="sy4">;</span>
&nbsp; <span class="br0">&#125;</span>
&nbsp; 
&nbsp; std<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>buffer, selectedText <span class="sy2">+</span> offset, size<span class="br0">&#41;</span><span class="sy4">;</span>
&nbsp; <span class="kw1">return</span> std<span class="sy4">::</span><span class="kw3">strlen</span><span class="br0">&#40;</span>selectedText<span class="br0">&#41;</span> <span class="sy2">-</span> offset<span class="sy4">;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span><span class="sy2">**</span> argv<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
&nbsp; <span class="kw4">struct</span> fuse_operations operations<span class="sy4">;</span>
&nbsp; operations.<span class="me1">getattr</span> <span class="sy1">=</span> my_getattr<span class="sy4">;</span>
&nbsp; operations.<span class="me1">read</span> <span class="sy1">=</span> my_read<span class="sy4">;</span>
&nbsp; operations.<span class="me1">readdir</span> <span class="sy1">=</span> my_readdir<span class="sy4">;</span>
&nbsp; <span class="kw1">return</span> fuse_main<span class="br0">&#40;</span>argc, argv, <span class="sy3">&amp;</span>operations, <span class="kw2">nullptr</span><span class="br0">&#41;</span><span class="sy4">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Чтобы смонтировать файловую систему нужно набрать следующее:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="453121402"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="453121402" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">.<span class="sy0">/</span><span class="br0">&#91;</span>имя запускаемого файла<span class="br0">&#93;</span> <span class="re5">-f</span> <span class="br0">&#91;</span>точка монтирования<span class="br0">&#93;</span></pre></td></tr></table></div></td></tr></tbody></table></div>Чтобы отмонтировать файловую систему нужно набрать следующее:<br />
<div class="codeblock"><table class="bash"><thead><tr><td colspan="2" id="996463720"  class="head">Bash</td></tr></thead><tbody><tr class="li1"><td><div id="996463720" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">fusermount <span class="re5">-u</span> <span class="br0">&#91;</span>точка монтирования<span class="br0">&#93;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Loafer</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/899942/5474.html</guid>
		</item>
	</channel>
</rss>
