<?xml version="1.0"?>
<rss version="2.0"><channel><title/><link>https://ap-pro.ru/blogs/blog/24-podval-aziatki-viktora/</link><description><![CDATA[<p style="text-align: center;">
	<a class="simple-button-plugin" href="https://ap-pro.ru/tags/%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8%20%D0%BF%D1%80%D0%BE%20%D1%81%D1%82%D0%B0%D0%BB%D0%BA%D0%B5%D1%80/" rel="" style="display: inline-block; background-color: transparent; border: 1px solid rgb(255, 255, 255); padding: 5px 10px; border-radius: 5px; font-size: 14px; cursor: pointer; color: rgb(255, 255, 255) !important; text-decoration: none !important;" target="_blank">Книги про Сталкер</a> <a class="simple-button-plugin" href="https://ap-pro.ru/tags/%D1%80%D0%B5%D0%BD%D0%B4%D0%B5%D1%80%D1%8B%20%D0%BF%D0%BE%20%D1%81%D1%82%D0%B0%D0%BB%D0%BA%D0%B5%D1%80%D1%83/" rel="" style="display: inline-block; background-color: transparent; border: 1px solid rgb(255, 255, 255); padding: 5px 10px; border-radius: 5px; font-size: 14px; cursor: pointer; color: rgb(255, 255, 255) !important; text-decoration: none !important;" target="_blank">Рендеры по Сталкеру</a>
</p>]]></description><language>ru</language><item><title>&#x41D;&#x43E;&#x432;&#x44B;&#x439; &#x431;&#x43E;&#x442; AP-PRO &#x434;&#x43B;&#x44F; Discord</title><link>https://ap-pro.ru/blogs/entry/1042-novyy-bot-ap-pro-dlya-discord/</link><description><![CDATA[<p style="text-align: justify;">
	В Discord-е AP-PRO вновь появился бот! Я уже далеко не в первый раз делаю бота для AP-PRO. Первые 2 версии были сделаны для Telegram и не отличались особенным качеством по сравнению с текущим. Так же была версия для Discord-а, однако она технически устарела, из-за чего я решил переписать её, используя знания, которые я получил во время работы над языковым расширением для VSCode (<a href="https://ap-pro.ru/forums/topic/3561-ltx-support-podderzhka-sintaksisa-cop/" rel="">подробнее тут</a>). Время описать нововведения.
</p>

<p style="text-align: justify;">
	<span style="font-size:22px;">Новая реализация команд</span>
</p>

<hr><p style="text-align: justify;">
	Как я писал выше, я уже делал бота и он технически устарел. Ранее, для использования команд, было нужно указывать уникальный префикс и вручную писать название команды. Сейчас же команды встроены в Discord и грамотно оформлены:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://ap-pro.ru/uploads/monthly_2023_05/image.png.6644847a117dfa0aacce9d86e8906d74.png" data-fileid="25772" data-fileext="png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25772" data-ratio="40,9" style="height: auto;" width="1000" data-src="https://ap-pro.ru/uploads/monthly_2023_05/image.thumb.png.9dcef915b9d7999114464b80b7443d47.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></a>
</p>

<p style="text-align: justify;">
	Префикс для всех ботов стал общим, команды хранятся в виде списка, при том, с наличием возможных аргументов и описания. То есть, если раньше о функционале бота можно было даже не догадываться, то сейчас же пропустить что-то стало затруднительно.
</p>

<p style="text-align: justify;">
	<span style="font-size: 22px;">Новый алгоритм сбора информации</span>
</p>

<hr><p style="text-align: justify;">
	Начнем с того, что бот умеет собирать информацию с сайта и хранить её для отображения в Discord-е. На этом и основывались все версии бота. Он "парсит" страницу и после сохраняет в базе данных информацию с неё, для того чтобы сделать работу легче, быстрее и не добавлять лишней нагрузки сайту. Однако, с открытием мною асинхронности, это больше не является такой сильной проблемой. Для начала, достаточно сравнить скорость сбора информации обоих алгоритмов:
</p>

<ul><li style="text-align: justify;">
		Старый алгоритм:
	</li>
</ul><p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25768" data-ratio="36.81" data-unique="k8m73q7kk" style="height: auto;" width="345" data-src="https://ap-pro.ru/uploads/monthly_2023_05/image.png.d41f5df5f410dcd9d39efbd744511bd5.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

<ul><li style="text-align: justify;">
		Новый алгоритм с асинхронностью:
	</li>
</ul><p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25769" data-ratio="50.23" data-unique="4xlmcw4um" style="height: auto;" width="426" data-src="https://ap-pro.ru/uploads/monthly_2023_05/image.png.434b681e039e4506b829115cfa93d315.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

<p style="text-align: justify;">
	Самое интересное, что таких показателей со старым алгоритмом можно было добиться только при условии, что бот пропускал записи, которые уже были в базе данных, то есть, сбор только новой информации.
</p>

<p style="text-align: justify;">
	Однако, у данного алгоритма есть проблема. Мне до конца не ясно, из-за чего это происходит, однако иногда бот просто не может получить страницу, даже спустя несколько попыток. Я предполагаю, что алгоритм работает настолько быстро, что срабатывает некоторая защита, которая мешает получить страницу. К сожалению, проверить или исправить у меня это не вышло, поэтому я просто сохраняю информацию о том, что именно не вышло получить и надеюсь решить это в будущем.
</p>

<p style="text-align: justify;">
	<span style="font-size:22px;">Фильтры для модификаций</span>
</p>

<hr><p style="text-align: justify;">
	Раньше бот выдавал игроку случайную модификацию при вызове команды "?random". Если же он хотел случайный мод на определённой платформе, то использовал команды: "?random_soc", "?random_cs" или "?random_cop". Как можно догадаться, и со стороны разработчика и со стороны пользователя это было неудобно. Однако сейчас, с появлением полноценной поддержки аргументов, можно ограничиться лишь командой "/random", где, при желании, можно указать желаемую часть игры.
</p>

<p style="text-align: justify;">
	Однако, зачем останавливаться на этом? Я тоже спросил себя об этом, и после некоторых манипуляций с кодом добавил еще несколько фильтров, количество которых я планирую увеличить. На данный момент, можно отфильтровать моды по таким параметрам:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="25774" href="https://ap-pro.ru/uploads/monthly_2023_05/image.png.54cd1851fdf1339062888147cc2ad37c.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25774" data-ratio="27.50" data-unique="6idhtd6tt" style="width: 600px; height: auto;" width="1000" data-src="https://ap-pro.ru/uploads/monthly_2023_05/image.thumb.png.a056878ef86653bbf61eecafe1e3ae49.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></a>
</p>

<ul><li style="text-align: justify;">
		Часть из трилогии
	</li>
	<li style="text-align: justify;">
		Минимальная средняя оценка
	</li>
	<li style="text-align: justify;">
		Максимальная средняя оценка
	</li>
	<li style="text-align: justify;">
		Минимальное количество отзывов
	</li>
	<li style="text-align: justify;">
		Максимальное количество отзывов
	</li>
</ul><p style="text-align: justify;">
	Всё из перечисленного является опциональный. Небольшой список, однако я планирую сделать его больше, добавив:
</p>

<ul><li style="text-align: justify;">
		Минимальный год релиза
	</li>
	<li style="text-align: justify;">
		Максимальный год релиза
	</li>
	<li style="text-align: justify;">
		Наличие определённого тега у модификации
	</li>
	<li style="text-align: justify;">
		Наличие отзыва у пользователя (при подключённом профиле)
	</li>
</ul><p style="text-align: justify;">
	По сути, ничего невероятного, однако именно для этих параметров нужно произвести некоторые манипуляции кода, что будет уже в следующих обновлениях.
</p>

<p style="text-align: justify;">
	<span style="font-size: 22px;">Код, переписанный практически полностью</span>
</p>

<hr><p style="text-align: justify;">
	Не столько нововведения для пользователей, сколько лично для меня. Так как я переписывал бота с нуля, я брал некоторые готовые вещи из старой версии, которые в последствии переделывал. И скажу так, код был просто ужасен.
</p>

<p style="text-align: justify;">
	Например, код получения информации со страницы пользователя в старой версии занимал около 90 строк и выглядит он так:
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Старый код">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1681_9" style="">

<span class="kwd">def</span><span class="pln"> sync_info</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln">
    page </span><span class="pun">=</span><span class="pln"> requests</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">url</span><span class="pun">)</span><span class="pln">
    page_tree </span><span class="pun">=</span><span class="pln"> html</span><span class="pun">.</span><span class="pln">fromstring</span><span class="pun">(</span><span class="pln">page</span><span class="pun">.</span><span class="pln">content</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        nick </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileHeader"]/div[2]/div[2]/div/h1/text()'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">nick </span><span class="pun">=</span><span class="pln"> nick</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">nick </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Ошибка, пиши админу"</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        reputation </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileInfoColumn"]/div/div[2]/a/div/span[1]/text()'</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">or</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'/html/body/main/div/div/div/div[1]/div/div/div/div/div[1]/a/div/span[1]/text()'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reputation </span><span class="pun">=</span><span class="pln"> reputation</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reputation </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        posts </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileStats"]/ul/li[1]/text()[last()]'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">posts </span><span class="pun">=</span><span class="pln"> posts</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">posts </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        group </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileHeader"]/div[2]/div[2]/div/span/span/text()'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">group </span><span class="pun">=</span><span class="pln"> group</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">group </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        date </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileStats"]/ul/li[2]/time/text()'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">date </span><span class="pun">=</span><span class="pln"> date</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        reputation_leaders </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileStats"]/ul/li[4]/span/text()'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reputation_leaders </span><span class="pun">=</span><span class="pln"> reputation_leaders</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reputation_leaders </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">   
        self</span><span class="pun">.</span><span class="pln">contacts </span><span class="pun">=</span><span class="pln"> get_contacts_from_url</span><span class="pun">(</span><span class="pln">page_tree </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">contacts </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">    
        rewards_page </span><span class="pun">=</span><span class="pln"> requests</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">url </span><span class="pun">+</span><span class="pln"> </span><span class="str">"/?tab=node_awards_Awards"</span><span class="pun">)</span><span class="pln">
        rewards_page_tree </span><span class="pun">=</span><span class="pln"> html</span><span class="pun">.</span><span class="pln">fromstring</span><span class="pun">(</span><span class="pln">rewards_page</span><span class="pun">.</span><span class="pln">content</span><span class="pun">)</span><span class="pln">
        
        self</span><span class="pun">.</span><span class="pln">rewards </span><span class="pun">=</span><span class="pln"> rewards_page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="ipsTabs_elProfileTabs_elProfileTab_node_awards_Awards_panel"]/div/div[@class="ipsResponsive_showDesktop ipsResponsive_block"]/div/div[2]/h2/text()'</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">rewards </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        img_url </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfileHeader"]/div[1]/img/@data-src'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">img_url </span><span class="pun">=</span><span class="pln"> img_url</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">img_url </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        avatar </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="str">'//*[@id="elProfilePhoto"]/a[1]/img/@src'</span><span class="pun">)</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">avatar </span><span class="pun">=</span><span class="pln"> avatar</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">encode</span><span class="pun">(</span><span class="str">'raw-unicode-escape'</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">'utf-8'</span><span class="pun">).</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">avatar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">try</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reviews </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
        count </span><span class="pun">=</span><span class="pln"> get_page_count_of_articles</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">url</span><span class="pun">)</span><span class="pln">
        
        </span><span class="kwd">if</span><span class="pln"> count</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> count </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
                </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="pln">count</span><span class="pun">):</span><span class="pln">
                    </span><span class="kwd">if</span><span class="pln"> i </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
                        get_user_reviews</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">reviews</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
                get_user_reviews</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> count</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">reviews</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">except</span><span class="pun">:</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">reviews </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">None</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="str">"--devmode"</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> sys</span><span class="pun">.</span><span class="pln">argv</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">nick</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">reputation</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">posts</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">img_url</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">self</span><span class="pun">.</span><span class="pln">avatar</span><span class="pun">)</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p style="text-align: justify;">
	В новой же - 36 строк и выглядит это так:
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Новый код">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1681_11" style="">

<span class="pln">async </span><span class="kwd">def</span><span class="pln"> getUserInfo</span><span class="pun">(</span><span class="pln">url</span><span class="pun">:</span><span class="pln"> str</span><span class="pun">,</span><span class="pln"> user</span><span class="pun">:</span><span class="pln"> str</span><span class="pun">,</span><span class="pln"> id</span><span class="pun">:</span><span class="pln"> int</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="typ">Profile</span><span class="pun">:</span><span class="pln">
    address </span><span class="pun">=</span><span class="pln"> f</span><span class="str">'{url}/profile/{user}'</span><span class="pln">
    result </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">(</span><span class="pln">id</span><span class="pun">=</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">=</span><span class="pln">user</span><span class="pun">)</span><span class="pln">
    async </span><span class="kwd">with</span><span class="pln"> aiohttp</span><span class="pun">.</span><span class="typ">ClientSession</span><span class="pun">()</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> session</span><span class="pun">:</span><span class="pln">
        counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
        resp </span><span class="pun">=</span><span class="pln"> await session</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">address</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">while</span><span class="pln"> resp</span><span class="pun">.</span><span class="pln">status </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">200</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> counter </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> resp</span><span class="pun">.</span><span class="pln">status </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">:</span><span class="pln">
                resp</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span><span class="pln">
                counter </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
                await asyncio</span><span class="pun">.</span><span class="pln">sleep</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln">
            resp </span><span class="pun">=</span><span class="pln"> await session</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">address</span><span class="pun">)</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> resp</span><span class="pun">.</span><span class="pln">status </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">200</span><span class="pun">:</span><span class="pln">  
            resp</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span><span class="pln">
            result</span><span class="pun">[</span><span class="str">'valid'</span><span class="pun">]=</span><span class="kwd">False</span><span class="pln">
            _log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="pln">f</span><span class="str">"Can`t get {url}. Code: {resp.status}. Reason: {resp.reason}"</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Profile</span><span class="pun">(</span><span class="pln">result</span><span class="pun">)</span><span class="pln">

        page_tree </span><span class="pun">=</span><span class="pln"> html</span><span class="pun">.</span><span class="pln">fromstring</span><span class="pun">(</span><span class="pln">await resp</span><span class="pun">.</span><span class="pln">text</span><span class="pun">())</span><span class="pln">
        </span><span class="kwd">for</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> infoList</span><span class="pun">:</span><span class="pln">
            data </span><span class="pun">=</span><span class="pln"> page_tree</span><span class="pun">.</span><span class="pln">xpath</span><span class="pun">(</span><span class="pln">item</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> data </span><span class="pun">==</span><span class="pln"> </span><span class="pun">[]:</span><span class="pln">
                _log</span><span class="pun">.</span><span class="pln">warning</span><span class="pun">(</span><span class="pln">f</span><span class="str">"Can`t find {item[0]} for {url}. Get: {data}"</span><span class="pun">)</span><span class="pln">
                result</span><span class="pun">[</span><span class="pln">item</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pln">
                </span><span class="kwd">continue</span><span class="pln">
            data </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
                data </span><span class="pun">=</span><span class="pln"> item</span><span class="pun">[</span><span class="lit">2</span><span class="pun">](</span><span class="pln">data</span><span class="pun">)</span><span class="pln">
            result</span><span class="pun">[</span><span class="pln">item</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> data
        resp</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span><span class="pln">
        _log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="pln">f</span><span class="str">"Get data from {url}"</span><span class="pun">)</span><span class="pln">

        profile </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Profile</span><span class="pun">.</span><span class="pln">parse_obj</span><span class="pun">(</span><span class="pln">result</span><span class="pun">)</span><span class="pln">
        profile</span><span class="pun">.</span><span class="pln">contacts </span><span class="pun">=</span><span class="pln"> await getUserContacts</span><span class="pun">(</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> user</span><span class="pun">)</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> profile</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p style="text-align: justify;">
	Можете сказать, что это ничего особенного. Однако это разница с учётом того, что именно происходит в данном коде. Думаю, те кто хоть немного разбираются в программировании, понимают, что один код выгляди намного лучше второго, по многим причинам:
</p>

<ul><li style="text-align: justify;">
		Чтобы добавить новые данные, необходимо редактировать исходный код класса, в то время как в новой версии достаточно просто добавить новый пункт в массиве. Это легче и быстрее.
	</li>
	<li style="text-align: justify;">
		Убраны бессмысленное повторение кода, которое идентично для всех параметров
	</li>
	<li style="text-align: justify;">
		Масштабировать функционал проще
	</li>
	<li style="text-align: justify;">
		Код банально выглядит чище и легче
	</li>
</ul><p style="text-align: justify;">
	Кончено же, до идеала тут далеко, множество вещей мне предстоит выучить и исправить, но мне приятно наблюдать за тем, как я становлюсь лучше.
</p>

<hr><p style="text-align: justify;">
	На этом всё. Спасибо за внимание! Надеюсь, что данную статью было интересно почитать. Если кто-то имеет рекомендации по улучшению или идеи, которые бы хотелось увидеть - пишите. А если вас заинтересовал бот и вы хотите его лично опробовать, то он доступен в Discord-е, по этой ссылке, в канале #bot-ap-pro: <a href="https://discord.gg/TrqU83P" rel="external nofollow">Ссылка</a>
</p>]]></description><guid isPermaLink="false">1042</guid><pubDate>Sun, 07 May 2023 22:24:00 +0000</pubDate></item><item><title>&#x420;&#x435;&#x43D;&#x434;&#x435;&#x440; "&#x41C;&#x43E;&#x43D;&#x43E;&#x43B;&#x438;&#x442;"</title><link>https://ap-pro.ru/blogs/entry/761-render-monolit/</link><description><![CDATA[
<p style="text-align: justify;">
	Совсем недавно увидел на YouTube видео, где чел делал постер в Blender. Получился он крайне простым, чем-то похожим на SFM, но достаточно неплохим. Но не в этом суть, это видео вдохновило меня попробовать самому записать, так называемый, "Speed Art" или "Speed Paint". Не сказать, что я начал заниматься постерами достаточно давно, однако какой-никакой опыт в этом у меня есть. В прочем, данный рендер вышел не таким уж и идеальным, пока сам не могу понять, что с ним не так. Поэтому ваша критика в комментариях будет крайне уместной. Приятного просмотра!
</p>

<hr>
<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" id="ips_uid_9827_6" title="YouTube video player" width="560" data-embed-src="https://www.youtube.com/embed/U1rUFYm7ICI"></iframe>
</p>

<hr>
<p style="text-align: center;">
	<span style="color:#3498db;">Скачать арт: </span><a href="https://drive.google.com/file/d/10XTGGPVixFNASOTeXDAOn1QvHZO2_kBI/view?usp=sharing" rel="external nofollow">GoogleDrive</a>
</p>

<hr>
<p style="text-align: justify;">
	<em>P.S. А и да, простите за всякие уведомления и всплывающий пуск, думаю, к следующему видео такого не будет.</em>
</p>
]]></description><guid isPermaLink="false">761</guid><pubDate>Mon, 17 Jan 2022 09:05:15 +0000</pubDate></item><item><title>&#x420;&#x435;&#x43D;&#x434;&#x435;&#x440; "&#x417;&#x438;&#x43C;&#x43D;&#x44F;&#x44F; &#x437;&#x43E;&#x43D;&#x430;"</title><link>https://ap-pro.ru/blogs/entry/745-render-zimnyaya-zona/</link><description><![CDATA[
<p style="text-align: justify;">
	Ну что же, вот и подходит конец 2021 года. За это время произошло очень много событий, новые знакомства, знания и навыки. Увы, перепробовать столько модов, сколько я планировал, у меня не удалось. Ровно так же, как и выпустить мод в этом году. Но проблемы были не только с ним, но и с данной задумкой. О чем речь? В прошлом году (а точнее в этом) я делал вот такой рендер, который вышел не особо хорошим:
</p>
<iframe allowfullscreen="" class="ipsEmbed_finishedLoading" data-embedauthorid="6" data-embedcontent="" data-embedid="embed5148753613" scrolling="no" style="overflow: hidden; height: 426px; max-width: 100%;" data-embed-src="https://ap-pro.ru/blogs/entry/316-render-derevnya-novichkov-zimoy/?do=embed"></iframe>

<p style="text-align: justify;">
	Потому я принял решение, так как прошел почти целый год, я успел за это время набить руку, то следует сделать себе небольшое "испытание" - за маленькое количество времени (4-5 дней) выкатить максимальное количество постеров. Естественно, все разрушилось о моё умение распределять время, этому я еще не научился. Потому, из n-ого количества зимних рендеров у меня вышло только 3.
</p>

<p style="text-align: justify;">
	Изначально была задумка - Сделать зимнюю вариацию всем нам известных локаций или ключевых точек на них. Благо, есть прекрасный, известный всем любителям Блендера, аддон, который позволяет импортировать скомпилированные (игровые) локации. То есть, распаковал gamedata, закинул в блендер, подождал пока загрузиться и готово. Это очень упрощает процесс создания постеров, синематиков и прочего. Потихоньку Блендер перенимает плюсы СФМ и я надеюсь, что работать с ним станет еще проще.
</p>

<p style="text-align: justify;">
	Что же, что-то я заболтался. Прошу любить и критиковать:
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Одиночки у костра">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Этапы:</span></span>
		</p>

		<hr>
<p style="text-align: center;">
			<span style="color:#f39c12;"><img alt="1.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/jz1yzkB/1.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
		</p>

		<p style="text-align: center;">
			<span style="color:#f39c12;"><img alt="2.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/JQJVjhn/2.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
		</p>

		<p style="text-align: center;">
			<span style="color:#f39c12;"><img alt="3.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/QDrYxzW/3.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
		</p>

		<p style="text-align: center;">
			<img alt="4.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/dKh9XxQ/4.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Финал:</span></span>
		</p>

		<hr>
<p>
			<img alt="5.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/ZcCphXq/5.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>
	</div>
</div>

<hr>
<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="Мёртвый город">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Этапы:</span></span>
		</p>

		<hr>
<p>
			<img alt="1.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/jWYLc86/1.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="2.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/7NNvhwx/2.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="3.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/W5wk81M/3.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="4.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/8chNvrR/4.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="5.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/Jy4LHbh/5.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="6.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/PmfkH0R/6.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="7.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/wg7JxCn/7.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Финал:</span></span>
		</p>

		<hr>
<p style="text-align: center;">
			<img alt="8.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/F8rN5Y0/8.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>
	</div>
</div>

<hr>
<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option='Бар "100 рентген"'>
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Этапы:</span></span>
		</p>

		<hr>
<p>
			<img alt="1.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/GR4kpVs/1.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="2.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/rMHR9Jc/2.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="3.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/BCmGHPf/3.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<hr>
<p style="text-align: center;">
			<span style="font-size:20px;"><span style="color:#f39c12;">Финал:</span></span>
		</p>

		<hr>
<p>
			<img alt="4.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/NYpt2hk/4.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>
	</div>
</div>

<p style="text-align: justify;">
	Ну вот так вот. Кто хочет, можете скачать постеры в разрешении 4к ниже по ссылке:
</p>

<p style="text-align: center;">
	<a href="https://drive.google.com/drive/folders/1-clQaSqtZS1GiBCXX1kpBB0yk14p7SgP?usp=sharing" rel="external nofollow">&gt;&gt;&gt; Ссылки на скачивание (4к) &lt;&lt;&lt;</a>
</p>

<p style="text-align: justify;">
	Критика приветствуется, увы, точные данные, как в прошлый раз по времени рендера, количество Samples и прочего предоставить не могу, уже и не помню.
</p>

<p style="text-align: justify;">
	Ну а теперь, желаю вам в Новом году всего самого хорошего, побольше хабара и поменьше дырявых сапогов. А если вы разработчик, то еще сверху побольше терпения, усидчивости и поменьше вылетов. Всем удачных праздников и с Новым годом! UwU
</p>
]]></description><guid isPermaLink="false">745</guid><pubDate>Sat, 01 Jan 2022 04:36:24 +0000</pubDate></item><item><title>&#x420;&#x430;&#x437;&#x43C;&#x44B;&#x448;&#x43B;&#x435;&#x43D;&#x438;&#x435;: &#x41A;&#x43B;&#x430;&#x441;&#x441;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44F; &#x410;&#x440;&#x442;&#x435;&#x444;&#x430;&#x43A;&#x442;&#x43E;&#x432;</title><link>https://ap-pro.ru/blogs/entry/413-razmyshlenie-klassifikaciya-artefaktov/</link><description><![CDATA[
<p style="text-align: justify;">
	Не так давно в голове родилась очень интересная мысль, которая никак не хотела покидать мою голову. Как в Сталкере (имеется ввиду во вселенной Сталкера, а не в игре) может существовать классификация артефактов на отдельные типы, определяемые качествами, а так же местом рождения. Опытные Сталкеры могут определить, что перед ними за артефакт, просто посмотрев на него. Как мне кажется, такой простой классификации просто не может существовать и сейчас попытаюсь объяснить почему.
</p>

<p>
	Первым делом стоит понять, что такое артефакты:
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			Артефакты порождают аномалии из различных органических и неорганических веществ, попавших в зону досягаемости: трава, песок, куски плоти, металл и т.д. Разные типы аномалий порождают разные артефакты и их свойства могут быть как похожи, так и разительно отличаться.
		</p>

		<p style="text-align: right;">
			— Zone Chronicles
		</p>
	</div>
</blockquote>

<p style="text-align: justify;">
	То есть, Артефакты это сгусток материалов разного типа, который под воздействием аномальной активности приобрела некие свойства, которые зависят от типа аномалии, и могут быть либо положительными, либо отрицательными.
</p>

<p style="text-align: justify;">
	Однако отойдя от игровых условностей, можно подчеркнуть еще один фактор, реализация которого была бы немного не подходящей для игры, но была бы весьма логичной. Это собственно сам материал, из которого создается артефакт. Как всем известно, у разных материалов, разные свойства, а значит и свойства артефакта так же должны различаться от того, из какого материала он состоит. Из чего следует, что в Зоне практически невозможно найти 2 одинаковых артефакта, так как даже маленькая разница в соотношении количества материала может вызвать разницу в его свойствах. А значит, что каждый артефакт, который может найти Сталкер, следует изучить и определить тип без этого не удастся.
</p>

<p style="text-align: justify;">
	Однако классификация артефактов по воздействию на организм никуда не пропадёт, но станет куда больше, чем мы привыкли видеть и стандартные название артефактов исчезнут, так как каждый арт будет отличаться от другого и будет лишь походить на предыдущий, но никак не быть идентичным ему.
</p>

<p style="text-align: justify;">
	В любом случае, стоит помнить, что как бы это не выглядело логичным или очевидным. Подобное вряд ли когда-нибудь появиться в игре, и я не считаю это каким-то минусом. Иногда все-таки стоит оставлять примитивные системы классификаций, для того, чтобы игроку было комфортнее и интереснее играть. Хотя было бы интересно посмотреть, как бы изменился геймплей в случае, если бы такая механика была бы реализована.
</p>

<p style="text-align: center;">
	Можете написать в комментариях, что думаете по этому поводу?
</p>
]]></description><guid isPermaLink="false">413</guid><pubDate>Fri, 12 Mar 2021 12:34:25 +0000</pubDate></item><item><title>&#x420;&#x430;&#x437;&#x43C;&#x44B;&#x448;&#x43B;&#x435;&#x43D;&#x438;&#x435;: &#x410;&#x440;&#x433;&#x443;&#x43C;&#x435;&#x43D;&#x442;&#x44B;</title><link>https://ap-pro.ru/blogs/entry/331-razmyshlenie-argumenty/</link><description><![CDATA[
<p style="text-align: justify;">
	Натолкнуло меня на написание этой записи, блог Крима, где тот пытается всячески аргументировать те или иные точки зрения, которые, противоположны точке зрения большинства людей из сообщества. И, как мне кажется, эти самые точки зрения абсолютно противоположны тому, что действительно думает о них Крим. Может это попытка критического мышления? Но я сегодня поговорю немного о другом.
</p>

<p style="text-align: justify;">
	Я задался вопросом, почему, в основном, после прочтения его записи, остается ощущение недосказанности? Я постараюсь разобраться в этом и так же призываю всех прочитавших порассуждать на данную тему в комментариях. Даже если вы в чем-то будете со мной не согласны, я всегда рад альтернативному мнению, подкреплённой аргументами. Начнём.
</p>

<hr>
<p style="text-align: justify;">
	Для начала, что мне скажет Google по этому поводу?
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p style="text-align: justify;">
			Недосказанность – склонность к неполноте, к незаконченности высказываний;
		</p>
	</div>
</blockquote>

<p style="text-align: justify;">
	То есть, после прочтения я не чувствую, что меня смогли убедить или объяснить свою точку зрения, что мне сказали недостаточно, чтобы я согласился с мнением или считал её альтернативной.
</p>

<p style="text-align: justify;">
	Я бы выделил основную вещь в каждом споре или рассуждении. Как всем известно, умный человек не будет надеяться, что с ним согласятся, если он просто выскажет своё мнение по какому-либо вопросу. Для этого ему нужна информация, которая бы подтвердила его правоту или объяснила окружающим его точку зрения, проще говоря, аргументы.
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p style="text-align: justify;">
			Аргумент — логическая посылка, используемая отдельно или в совокупности с другими, с целью доказательства истинности определённого утверждения — тезиса. Чтобы тезис можно было считать истинным, все аргументы должны содержать в себе истинную информацию, достаточную для доказательства тезиса с помощью верных логических умозаключений.
		</p>
	</div>
</blockquote>

<p style="text-align: justify;">
	Думаю, многие замечали, что люди, которые вели спор без всяких аргументов попросту пытались перекрикивать своего "противника" или же переходили на личности. Это заведомо проигранный спор, так как, даже если оппонент не признаёт поражения, ему нечем аргументировать свою позицию. Поэтому, будь-то это поединок позиций или же дружеский спор, без аргументов не имеет смысла и начинать.
</p>

<p style="text-align: justify;">
	К чему я веду, как показывает практика, людям частенько не хватает аргументов для того, чтобы ввести спор, из-за чего они терпят поражение. Не хочу сказать, что может существовать только одна точка зрения, как раз наоборот. Но нужно уметь донести эту точку до остальных. В общем, проблема блога Крима, да и вообще многих людей, в недостаточном количестве аргументов. С чем это может быть связано?
</p>

<ul>
<li style="text-align: justify;">
		Из-за неграмотности. Согласитесь, сложно аргументировать то, в чем плохо разбираешься. Поэтому многие люди не просто не могу придумать ничего внятного, а иногда даже пишут всякий бред, взятый из своей головы, при чем без всякой проверки в том же интернете.
	</li>
	<li style="text-align: justify;">
		Из-за однобокости. Что за "Однобокость"? Я бы сказал, что это слишком узкое направление мнения, основанное только на собственном опыте. Так же можно сказать, что это мышление только с одной точки зрения, не принимая во внимание остальные. Как показывает практика, самым объективным окажется как раз мнение, собранное из мнений многих людей, так как они разные и мыслят тоже по-разному. И наоборот, мнение одного человека может оказаться слишком субъективным.
	</li>
</ul>
<p style="text-align: justify;">
	Что-то еще трудно придумать, но думаю, что этого достаточно. Всё сводиться к тому, что человек либо чего-то не знает, либо чего-то не замечает. В любом случае, для этого и существуют споры, так как в них ты и узнаешь об этом всём.
</p>

<hr>
<p style="text-align: justify;">
	Подведу итог, что я хотел этим всем сказать? Я не хочу никого выставить дураком, я лишь хотел сказать, что к подобным блогам, с размышлениями о том, какая позиция вернее другой, следует относиться основательнее и искать больше информации, чтобы даже та позиция, с который многие не согласны, воспринималась как альтернативная. Выделить аргументы "За" и "Против", спросить нескольких людей или друзей, что они думают по этому поводу, проверить достоверность аргументов в книгах или том же интернете. Иначе подобные мысли не уйдут дальше личного мнения.
</p>

<p style="text-align: justify;">
	В прочем, даже при написании этой записи было сложно выделить некоторые моменты... Все-таки, рассуждать на подобные тему сложнее, чем стрелять НПС в играх. Не знаю, что из этого выйдет, может я открыл какую-то страшную тайну, а может я вообще пишу о том, что всем давно известно. Но надеюсь, что вы просто задумаетесь о том, что я тут изложил, и поделитесь своими мыслями по этому поводу.
</p>
]]></description><guid isPermaLink="false">331</guid><pubDate>Mon, 25 Jan 2021 05:21:07 +0000</pubDate></item><item><title>&#x420;&#x435;&#x43D;&#x434;&#x435;&#x440; "&#x414;&#x435;&#x440;&#x435;&#x432;&#x43D;&#x44F; &#x41D;&#x43E;&#x432;&#x438;&#x447;&#x43A;&#x43E;&#x432; &#x437;&#x438;&#x43C;&#x43E;&#x439;"</title><link>https://ap-pro.ru/blogs/entry/316-render-derevnya-novichkov-zimoy/</link><description><![CDATA[
<p>
	Попытка сделать сталкерский рендер, в зимнее время года, в связи с прошедшими праздниками. Вдохновился одним очень красивым зимним артом, который и подтолкнул попробовать.
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;">Арт, по которому делался рендер:</span>
</p>

<p style="text-align: center;">
	<img alt="STALKER-%25D1%2580%25D0%25B0%25D0%25B7%2" class="ipsImage" data-ratio="60.91" height="609" style="height: auto;" width="1000" data-src="https://external-content.duckduckgo.com/iu/?u=http://img0.reactor.cc/pics/post/full/STALKER-%25D1%2580%25D0%25B0%25D0%25B7%25D0%25BD%25D0%25BE%25D0%25B5-%25D0%25B7%25D0%25B8%25D0%25BC%25D0%25B0-%25D0%259D%25D0%25BE%25D0%25B2%25D1%258B%25D0%25B9-%25D0%2593%25D0%25BE%25D0%25B4-1007192.jpeg&amp;f=1&amp;nofb=1" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

<p style="text-align: center;">
	<span style="color:#f39c12;">Рендер:</span>
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;"><img alt="12412514141414.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/1bJMwxb/12412514141414.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
</p>

<p>
	Не знаю, вышло хуже или лучше, но думаю, что новогодняя атмосфера хоть чуть-чуть чувствуется.
</p>

<p>
	<span style="color:#f39c12;">Время создания: </span>1 день<br><span style="color:#f39c12;">Время рендера:</span> 17 минут 52 секунды<br><span style="color:#f39c12;">Разрешение:</span> 1920 х 1080<br><span style="color:#f39c12;">Тип рендера: </span>Cycles<br><span style="color:#f39c12;">Samples:</span> 128
</p>

<p>
	Да, качество не самое лучшее, все-таки, на фото много деталей, которые плохо видны на таком разрешении. Моя первая попытка в позинге моделей сталкеров, да и импорта их в Blender. Попытался сделать их максимально живыми, вышло у меня или нет, не мне решать. Рендер более насыщенный и красочный, относительно оригинала, но оригинал выглядит более реалистично, не смотря на то, что это рисунок.
</p>

<p>
	<span style="color:#f39c12;">Этапы создания, если кому интересно:</span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			<img alt="Screenshot-1915.png" class="ipsImage" data-ratio="56.53" height="565" style="height: auto;" width="1000" data-src="https://i.ibb.co/QQ56627/Screenshot-1915.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="1241142612423512324361242365-890.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/vzkXNkg/1241142612423512324361242365-890.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="1241142612423512124324361242365-890.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/547VctN/1241142612423512124324361242365-890.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p>
			<img alt="12462152734567890.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/q5m0Jbf/12462152734567890.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>
	</div>
</div>

<p>
	На этом всё, всем спасибо за внимание, буду рад вашим комментариям по поводу этой работы, а так же конструктивной критике в её адрес, возможно, я допустил какую-то ошибку. Так же, если вам понравилась работа, то вы можете скачать её в разрешении FullHD по ссылке внизу, всем удачи!
</p>

<p style="text-align: center;">
	<a href="https://drive.google.com/file/d/1Lgmk7wB7wC10s02jZmJv8ZYgHy87w2-s/view?usp=sharing" rel="external nofollow">&gt;&gt;&gt; Ссылка на скачивание (FullHD) &lt;&lt;&lt;</a>
</p>
]]></description><guid isPermaLink="false">316</guid><pubDate>Tue, 12 Jan 2021 11:03:38 +0000</pubDate></item><item><title>&#x420;&#x435;&#x43D;&#x434;&#x435;&#x440; "&#x411;&#x430;&#x440; &#x427;&#x438;&#x441;&#x442;&#x43E;&#x433;&#x43E; &#x43D;&#x435;&#x431;&#x430;"</title><link>https://ap-pro.ru/blogs/entry/262-render-bar-chistogo-neba/</link><description><![CDATA[
<p style="text-align: justify;">
	Не так давно открыл для себя сферу рендеринга благодаря программе Blender, и для начала решил потренироваться на всеми любимом Сталкере. На данный момент, это 3-ая моя работа, поэтому о качестве не может идти и речи. На то, чтобы попробовать себя в рендере, меня натолкнуло несколько мыслей:
</p>

<ul>
<li style="text-align: justify;">
		Первая - это работа из мода <a href="https://ap-pro.ru/blogs/entry/212-%C2%ABnew-project%C2%BB-novaya-porciya-skrinshotov-ot-111120/" rel="">"New Project"</a>, а именно, скриншот из главного меню. Он был очень атмосферным и красивым, однако, как я понял, был сделан на движке игры, из-за чего страдал конечный результат. И тогда, вдохновившись этим, я решил создать что-то подобное, однако уже для своего мода и, как можно догадаться, сделать всё через 3D-редактор. Я планировал сделать всё красиво и главное, всё это анимировать. Однако первая работа в новой сфере, как всегда, самая трудная, поэтому процесс создания затянулся (но работа не брошена, а идёт до сих пор).
	</li>
	<li style="text-align: justify;">
		Вторая - это то, что многие делают постеры в SFM, однако его главной проблемой является очень маленькое количество моделей и ограничения самого редактора, так как работать можно только с положением объектов и их заранее заготовленными параметрами, что очень сковывает мою творческую натуру. Поэтому я хотел найти редактор, который дал бы больше возможностей.
	</li>
</ul>
<p style="text-align: justify;">
	По этим причинам я задался вопросом: "А какой использовать редактор, где я смогу сделать красивый рендер, который был бы очень похож на то или иное место в Сталкере, но он не заставлял бы меня мучатся из-за технических ограничений?". И я нашел ответ - редактор Blender. Там я и смог начать делать подобные постеры.
</p>

<p style="text-align: justify;">
	Так, с предысторией закончили, теперь перейдём к самой работе. Я решил попробовать сделать бар на базе Чистого неба, где сидит всем известный Холод.
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;">Скриншот, который с которого всё делалось:</span>
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;"><img alt="Xr-Engine-2013-02-03-18-16-03-68-1.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/crZhn5T/Xr-Engine-2013-02-03-18-16-03-68-1.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;">Конечный результат рендера:</span>
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;"><img alt="4.png" class="ipsImage" data-ratio="56.25" height="562" style="height: auto;" width="1000" data-src="https://i.ibb.co/6FVwvZ5/4.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></span>
</p>

<p style="text-align: justify;">
	Не знаю, хорошо вышло или плохо, но я результатом остался доволен, а это самое главное. Теперь немного технической информации о рендере, если кому интересно:
</p>

<ul>
<li style="text-align: justify;">
		<span style="color:#f39c12;">Время создания: </span>2 дня
	</li>
	<li style="text-align: justify;">
		<span style="color:#f39c12;">Время рендера: </span>27 минут 34 секунды
	</li>
	<li style="text-align: justify;">
		<span style="color:#f39c12;">Разрешение: </span>3840 × 2160
	</li>
	<li style="text-align: justify;">
		<span style="color:#f39c12;">Тип рендера: </span>Cycles
	</li>
	<li style="text-align: justify;">
		<span style="color:#f39c12;">Samples: </span>256
	</li>
</ul>
<p style="text-align: justify;">
	Сразу скажу, что да, тут есть куча отличий от оригинала, но лишь потому что, во-первых, каждая модель делась с нуля и моделей с интернета не использовалось (текстуры брались из разных источников), и во-вторых, я не хотел делать копию, а лишь основывался на оригинале, используя его как пример.
</p>

<p style="text-align: justify;">
	<span style="color:#f39c12;">Этапы создания, если кому интересно:</span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="" data-ipsspoiler-option="">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p style="text-align: center;">
			<img alt="Screenshot-1768.png" class="ipsImage" data-ratio="56.41" height="564" style="height: auto; width: 1000px;" width="1000" data-src="https://i.ibb.co/dGcnt5q/Screenshot-1768.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1769.png" class="ipsImage" data-ratio="56.78" height="567" style="height: auto;" width="1000" data-src="https://i.ibb.co/gV1dFDh/Screenshot-1769.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1751.png" class="ipsImage" data-ratio="57.99" height="579" style="height: auto;" width="1000" data-src="https://i.ibb.co/h8S6BKj/Screenshot-1751.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1752.png" class="ipsImage" data-ratio="56.90" height="569" style="height: auto;" width="1000" data-src="https://i.ibb.co/DKW5Mhk/Screenshot-1752.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1753.png" class="ipsImage" data-ratio="56.57" height="565" style="height: auto;" width="1000" data-src="https://i.ibb.co/C6GMp7r/Screenshot-1753.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1757.png" class="ipsImage" data-ratio="56.05" height="560" style="height: auto;" width="1000" data-src="https://i.ibb.co/SwHzTNJ/Screenshot-1757.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1754.png" class="ipsImage" data-ratio="56.17" height="561" style="height: auto;" width="1000" data-src="https://i.ibb.co/h8j2DQ1/Screenshot-1754.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1770.png" class="ipsImage" data-ratio="56.11" height="561" style="height: auto;" width="1000" data-src="https://i.ibb.co/ZmTb4j7/Screenshot-1770.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1771.png" class="ipsImage" data-ratio="56.10" height="561" style="height: auto;" width="1000" data-src="https://i.ibb.co/gmPCQKx/Screenshot-1771.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>

		<p style="text-align: center;">
			<img alt="Screenshot-1772.png" class="ipsImage" data-ratio="55.97" height="559" style="height: auto;" width="1000" data-src="https://i.ibb.co/PcmtmVg/Screenshot-1772.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></p>
	</div>
</div>

<p style="text-align: justify;">
	На этом всё, всем спасибо за внимание, буду рад вашим комментариям по поводу этой работы, а так же конструктивной критике в её адрес, возможно, я допустил какую-то ошибкул. Так же, если вам понравилась работа, то вы можете скачать её в разрешении 4К по ссылке внизу, всем удачи!
</p>

<p style="text-align: center;">
	<a href="https://drive.google.com/file/d/1aFvTQw98j1hx9ykhcGWFFO68llQIeprv/view?usp=sharing" rel="external nofollow">&gt;&gt;&gt; Ссылка на скачивание (4К) &lt;&lt;&lt;</a>
</p>
]]></description><guid isPermaLink="false">262</guid><pubDate>Thu, 10 Dec 2020 22:50:00 +0000</pubDate></item><item><title>&#x410;&#x43B;&#x435;&#x43A;&#x441;&#x435;&#x439; &#x413;&#x440;&#x430;&#x432;&#x438;&#x446;&#x43A;&#x438;&#x439; - "&#x412; &#x437;&#x43E;&#x43D;&#x435; &#x442;&#x443;&#x43C;&#x430;&#x43D;&#x430;"</title><link>https://ap-pro.ru/blogs/entry/64-aleksey-gravickiy-v-zone-tumana/</link><description><![CDATA[
<p>
	<span style="font-size:14px;"><em>Небольшое лирическое отступление. Решил создать этот блог, чтобы вести некие записи для себя и заинтересовать тех, кто еще не знакомился с книгами по Сталкеру. До этого я не читал (слушал) книг по Сталкеру. Поэтому здесь может быть небольшая часть субъективности, хотя, где её нет? Что же, начнем.</em></span>
</p>

<p style="text-align: center;">
	<span style="font-size:14px;"><em><img alt="image.png" class="ipsImage" data-ratio="159.04" height="660" style="height: auto; width: 400px;" width="415" data-src="https://i.ibb.co/vkvWPXg/image.png" src="https://ap-pro.ru/applications/core/interface/js/spacer.png"></em></span>
</p>

<p>
	Произведение<span style="color:#f39c12;"> "В зоне тумана"</span><strong> </strong>было написано <span style="color:#f39c12;">Алексеев Гравицким</span> и послужило началом цикла<span style="color:#f39c12;"> "Угрюмый"</span>, который состоит из двух книг, считая эту. В книге главным героем выступает Сталкер<span style="color:#f39c12;"> "Угрюмый"</span>, как не странно, и рассказ идет от его лица, где он рассказывает о своих буднях и событиях, которые происходили дальше.
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Небольшое описание для тех, кто еще не читал:</span></span>
</p>

<p>
	Данная книга определенно советуется для ознакомления. В ней присутствует как и приятные, так и достаточно жестокие моменты. Читать интересно, рассказ успеет не раз приятно удивить. Автор пишет красиво, приятно описывая происходящее вокруг. Персонажи хорошо прописаны, как это позволяет реалии Зоны, но чувствуется их характер.
</p>

<p style="text-align: center;">
	<span style="font-size:20px;"><span style="color:#f39c12;">Осторожно! Далее могут быть спойлеры!</span></span>
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Персонажи:</span></span>
</p>

<p>
	В рассказе могу выделить 3-ёх персонажей, по моему мнению:
</p>

<ul>
<li>
		<span style="color:#f39c12;">Угрюмый</span> - опытный Сталкер, который в Зоне 6 лет или даже больше, предпочитает не заводить знакомства. Зарабатывает на жизнь артефактами, продавая их Бармену за копейки, но считает это хорошим вариантом для себя, так как для него главное не деньги, а просто возможность делать что-то.
	</li>
	<li>
		<span style="color:#f39c12;">Хлюпик</span> - человек, недавно попавший Зону, который предлагает бешеные деньги за то, чтобы его отвели к Монолиту. Добрый и вежливый, однако совсем не готовый к прибыванию в Зоне...
	</li>
	<li>
		<span style="color:#f39c12;">Мунлайт</span> - Сталкер-весельчак, который все-время улыбается. Хоть с виду не скажешь, однако он достаточно опытен. Предлагает Угрюмому вместе с ним отвести <span style="color:#f39c12;">Хлюпика</span> к Монолиту.
	</li>
</ul>
<p>
	Персонажи очень разные, из-за чего очень контрастируют на фоне друг друга. Считаю это плюсом. Персонажи прописаны хорошо, у каждого есть своя история и четкий характер.
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Сюжет:</span></span>
</p>

<p>
	Что на счет сюжета? Он хорош, интересная история, которая частенько приправлена мистикой. Те, кто знакомы с вселенной Сталкер по серии игр, явно по другому начнут смотреть на перестрелки и стычки с мутантами после этой книги.
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Атмосфера:</span></span>
</p>

<p>
	Очень хорошая, ощущается та самая Зона, жуткая и страшная, но по своему красивая.
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Аудиокнига:</span></span>
</p>

<p>
	К сожалению, осилить 400 страниц я не смог, читать не привык и частенько отвлекался на различные мелочи. Однако все очень хвалили эту книгу и я решил её послушать, и не прогадал! Слушал в озвучке <span style="color:#f39c12;">Станислава Концевича</span>, и этот человек знает толк в озвучке! Голос идеально подошел для Угрюмого, но и остальных персонажей он озвучил на высоте. Слушал с удовольствием!
</p>

<p>
	<span style="font-size:20px;"><span style="color:#f39c12;">Моё мнение:</span></span>
</p>

<p>
	Что я могу сказать про книгу? Она мне понравилась, даже очень! Настолько, что хотелось её прочитать (прослушать) еще раз, как только я закончил. Особенно понравилась первая половина, примерно до моменты с ареной, включительно. Определенно советую её! Персонажи, сюжет, филосовские моменты, перестрелки, атмосфера и т.д. - все на высоте!
</p>

<p>
	Так же, хотелось бы узнать ваше мнение про книгу, что вам в ней понравилось, а что - нет. Всем спасибо!
</p>

<p style="text-align: center;">
	<span style="color:#f39c12;">Следующая книга будет "Зачистка" от того же автора.</span>
</p>
]]></description><guid isPermaLink="false">64</guid><pubDate>Wed, 19 Aug 2020 19:29:00 +0000</pubDate></item></channel></rss>
