<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Электронный научно-практический журнал «Современные научные исследования и инновации» &#187; Жеребцова Ксения Владимировна</title>
	<atom:link href="http://web.snauka.ru/issues/author/kseniazerebcova1/feed" rel="self" type="application/rss+xml" />
	<link>https://web.snauka.ru</link>
	<description></description>
	<lastBuildDate>Fri, 17 Apr 2026 07:29:22 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Сравнительный анализ моделей нейронных сетей в задаче распознавания математических действий</title>
		<link>https://web.snauka.ru/issues/2024/06/102172</link>
		<comments>https://web.snauka.ru/issues/2024/06/102172#comments</comments>
		<pubDate>Tue, 11 Jun 2024 15:16:53 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[Google Colab]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[архитектура нейронных сетей]]></category>
		<category><![CDATA[параметры обучения]]></category>
		<category><![CDATA[эффективность]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2024/06/102172</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович Уфимский университет науки и технологий, Нефтекамский филиал, к.ф.-м.н. TensorFlow &#8211; это библиотека программного обеспечения с открытым исходным кодом, созданная Google, которая используется для внедрения систем машинного обучения и глубокого обучения. Эти два имени содержат ряд мощных алгоритмов, которые разделяют общую задачу &#8211; позволить компьютеру узнать, как автоматически определять сложные шаблоны и / [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
Уфимский университет науки и технологий, Нефтекамский филиал, к.ф.-м.н.</em></p>
<p style="text-align: justify;"><span>TensorFlow &#8211; это библиотека программного обеспечения с открытым исходным кодом, созданная Google, которая используется для внедрения систем машинного обучения и глубокого обучения. Эти два имени содержат ряд мощных алгоритмов, которые разделяют общую задачу &#8211; позволить компьютеру узнать, как автоматически определять сложные шаблоны и / или принимать наилучшие возможные решения. TensorFlow, в основе своей, является библиотекой для программирования потока данных. Он использует различные методы оптимизации, чтобы сделать вычисления математических выражений проще и эффективнее.<br />
</span></p>
<p style="text-align: justify;"><span>В TensorFlow константы создаются с использованием функции: constant(value, dtype=None, shape=None, name=&#8217;Const&#8217;, verify_shape=False), где value постоянное значение, которое будет использоваться при дальнейших вычислениях, dtype является параметром, указывающим тип данных (например, float32/64, int8/16), shape является необязательным параметром, указывающим размер массива данных, name является необязательным задающим имя для тензора. Если вам нужны константы с определенными значениями внутри вашей обучающей модели, тогда объект типа constant может использоваться </span>как в следующем примере: z = tf.constant(5.2, name=&#8221;x&#8221;, dtype=tf.float32).</p>
<p style="text-align: justify;"><span>Для создания сверточной нейронной сети была выбрана платформа Google Colab. Она обладает рядом преимуществ, а именно универсальна, является бесплатной платформой, представляет мощные технологии обработки данных и машинного обучения.<br />
</span></p>
<p style="text-align: justify;"><span>Таким образом, разработана сверточная нейронная сеть для решения задачи классификации изображений и создано рабочее окружение для написания кода на языке программирования Python.<br />
</span></p>
<p style="text-align: justify;"><span>Решение задачи классификации изображений с помощью сверточных нейронных сетей осуществляет Google Colab — это бесплатный облачный сервис на основе Jupyter Notebook, он предоставляет всё необходимое для машинного обучения прямо в браузере, предоставляет бесплатный доступ.<br />
</span></p>
<p style="text-align: justify;"><span>Google Colab &#8211; блокнот для программирования на языке Python. В нем есть возможность для работы с серьезными технологиями при разработке реальных приложений data science и ML, предоставляет все необходимое для решения задач по анализу и обработке данных (с применимостью к Python).<br />
</span></p>
<p style="text-align: justify;"><span>Python – высокоуровневый язык программирования, который опирается на повышение производительности разработчика и читаемости кода. Это интерпретируемый язык программирования, то есть не требует компиляции в байт-код.<br />
</span></p>
<p style="text-align: justify;"><span>Важным этапом в решении задачи машинного обучения вообще, в т.ч. задачи компьютерного зрения, является этап формирования обучающей выборки, или датасета. При этом на первый план выходит необходимость обеспечения репрезентативности обучающей выборки. Она имеет три аспекта:<br />
</span></p>
<p style="text-align: justify;"><span>– достаточность — число обучающих примеров должно быть достаточным для обучения;<br />
</span></p>
<p style="text-align: justify;"><span>– разнообразие;<br />
</span></p>
<p style="text-align: justify;"><span>– равномерность представления классов.<br />
</span></p>
<p style="text-align: justify;"><span>Датасеты – это то, на чем основывается наука о данных, материал, на котором основаны все исследования. В основном рассматривают два типа данных: традиционные и большие (Big Data).<br />
</span></p>
<p style="text-align: justify;"><span>Традиционные данные (структурируются и хранятся в базах, которые управляются с одного компьютера, данные представлены в виде таблиц, содержащих текст или числа).<br />
</span></p>
<p style="text-align: justify;"><span>Большие данные (массивнее, чем традиционные, основываются как на разнообразии (числа, текст, изображения, аудио, видео и т. д.), так и скорости извлечения и вычисления в реальном времени, и объема.)<br />
</span></p>
<p style="text-align: justify;"><span>Датасеты разделяются на три категории:<br />
</span></p>
<p style="text-align: justify;"><span>1. Простая запись &#8211; это самая простая форма, не имеющая явной связи между строками-наблюдениями или столбцами-признаками (каждая строка имеет одинаковый набор характеристик).<br />
</span></p>
<p style="text-align: justify;"><span>2. Графы (отношения между объектами фиксируются связями).<br />
</span></p>
<p style="text-align: justify;"><span>3. Упорядоченные записи (некоторые данные упорядочены во времени или пространстве).<br />
</span></p>
<p style="text-align: justify;"><span>Разработка моделей нейронной сети выполняется в облачном сервисе Google Colab. На первом этапе создается папка, в которой будет находится датасет и скрипт с нейронной сетью.<br />
</span></p>
<p style="text-align: justify;"><span>Работа над нейронной сетью начинается с добавления библиотек Tensorflow. Загружаем нужные библиотеки:<br />
</span></p>
<p style="text-align: justify;"><span>from tensorflow.keras.models import Sequential<br />
</span></p>
<p style="text-align: justify;"><span>from tensorflow.keras.layers import Dense, Flatten<br />
</span></p>
<p style="text-align: justify;"><span>import pandas as pd<br />
</span></p>
<p style="text-align: justify;"><span>import numpy as np<br />
</span></p>
<p style="text-align: justify;"><span>import matplotlib.pyplot as plt<br />
</span></p>
<p style="text-align: justify;"><span>Так как нейронная сеть создается на сервисе Google Colab, датасет находится на Google диске, необходимо подключить диск к сети.<br />
</span></p>
<p style="text-align: justify;"><span>from google.colab import drive<br />
</span></p>
<p style="text-align: justify;"><span>drive.mount(&#8216;/content/drive/&#8217;)<br />
</span></p>
<p style="text-align: justify;"><span>В случае успешного подключения к диску появляется всплывающее окно, говорящее об успешном подключении к нему.<br />
</span></p>
<p style="text-align: justify;"><span>Drive mounted at /content/drive/; to attempt to forcibly remount, call drive.mount(&#8220;/content/drive/&#8221;, force_remount=True).<br />
</span></p>
<p style="text-align: justify;"><span>Переменная PATH показывает путь сети к ранее созданному датасету.<br />
</span></p>
<p style="text-align: justify;"><span>PATH = &#8216;/content/drive/My Drive/II/nf/&#8217;<br />
</span></p>
<p style="text-align: justify;"><span>Далее создадим переменные, которые будут содержать названия наших классов<br />
</span></p>
<p style="text-align: justify;"><span><span>target_name = ["</span><span>✖</span><span>","</span><span>✚</span><span>","&lt;","&gt;","±","•","–","="]<br />
</span></span></p>
<p style="text-align: justify;"><span>DIR = &#8220;dataset_ _mathdeystvo &#8221;<br />
</span></p>
<p style="text-align: justify;"><span>PATH = &#8216;/content/drive/My Drive/&#8217;+ DIR + &#8216;/&#8217;<br />
</span></p>
<p style="text-align: justify;"><span>PATH – корневой каталог для всех имеющихся на диске датасетов.<br />
</span></p>
<p style="text-align: justify;"><span>Переменные train_dir, test_dir, pred_dir – это пути, которые указывают на каталоги с данными для: обучения, тестирования, предсказания.<br />
</span></p>
<p style="text-align: justify;"><span>Следующим шагом указываем размер изображения. Тензоры можно рассматривать как матрицы, с формами. В Keras сам входной слой – это не слой, а тензор. Это стартовый тензор, который отправляется на первый скрытый слой. Этот тензор должен иметь ту же форму, что и тренировочные данные. Размер изображений в датасете составляет 20*20. Более удобно вводить переменную input_shape, которая в себе содержит сразу размерность изображений и количество фильтров.<br />
</span></p>
<p style="text-align: justify;"><span>В данной сети фильтр 1, так как используемые изображения в черно-белом цвете. Указываем размер мини-выборки с помощью переменной batch_size, которая отображает количество изображений, которые изучает модель за один проход. Нейронная сеть работает с данными постепенно, обработка происходит последовательно (частями).<br />
</span></p>
<p style="text-align: justify;"><span># Размеры изображения<br />
</span></p>
<p style="text-align: justify;"><span>img_width, img_height = 20, 20<br />
</span></p>
<p style="text-align: justify;"><span>input_shape = (img_width, img_height, 1)<br />
</span></p>
<p style="text-align: justify;"><span># Размер мини-выборки<br />
</span></p>
<p style="text-align: justify;"><span>batch_size = 128<br />
</span></p>
<p style="text-align: justify;"><span># количество классификации<br />
</span></p>
<p style="text-align: justify;"><span>N = len(classes)<br />
</span></p>
<p style="text-align: justify;"><span>Загружаем данные для обучения с помощью метода pd.read_csv:<br />
</span></p>
<p style="text-align: justify;"><span>train = pd.read_csv(PATH + &#8216;train.csv&#8217;, sep=&#8221;,&#8221;) #, nrows=3975<br />
</span></p>
<p style="text-align: justify;"><span>Загружаем данные для тестирования:<br />
</span></p>
<p style="text-align: justify;"><span>val = pd.read_csv(PATH + &#8216;validate.csv&#8217;)<br />
</span></p>
<p style="text-align: justify;"><span>Исследуем данные. Просматриваем данные для обучения:<br />
</span></p>
<p style="text-align: justify;"><span>train[:5]<br />
</span></p>
<p style="text-align: justify;"><span>Выбираем 8 видов изображений (знак умножения, знак сложения, знак больше, знак меньше, знак плюс-минус, точка, знак минус, знак равно). Посмотрим на тренировочные данные:<br />
</span></p>
<p style="text-align: justify;"><span>plt.figure(figsize=(10,10))<br />
</span></p>
<p style="text-align: justify;"><span>start = 0<br />
</span></p>
<p style="text-align: justify;"><span>for i in range(start,start+50):<br />
</span></p>
<p style="text-align: justify;"><span> plt.subplot(5,10,i-start+1)<br />
</span></p>
<p style="text-align: justify;"><span> plt.xticks([])<br />
</span></p>
<p style="text-align: justify;"><span> plt.yticks([])<br />
</span></p>
<p style="text-align: justify;"><span> plt.grid(False)<br />
</span></p>
<p style="text-align: justify;"><span> plt.imshow(x_train[i].reshape((img_width, img_height)), cmap=plt.cm.binary)<br />
</span></p>
<p style="text-align: justify;"><span> plt.xlabel(classes[y_train[i]])<br />
</span></p>
<p style="text-align: justify;"><span>Был собран датасет в количестве нескольки тысяч изображений в черно-белом цвете (рисунок 6), так как для отработки нейронной сети необходимо большое количество изображений (при малых объемах датасета сеть свою работу не выполняет).<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_1.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span><em>Рисунок 1. Датасет<br />
</em></span></p>
<p style="text-align: justify;"><span>Работа нейронной сети рассматривается в трех моделях.<br />
</span></p>
<p style="text-align: justify;"><span>1.    Двухслойная нейронная сеть.<br />
</span></p>
<p style="text-align: justify;"><span>Рассматривается сеть из двух нейронных слоев. Для создания модели используется класс Sequential. На входном слое находятся 1000 нейронов. Функция активации (запуска) relu, размер входных данных = 1024. На последнем слое должно быть 4 нейрона, так как это количество должно совпадать с количеством классификаций изображений (треугольник, квадрат, окружность, ромб).<br />
</span></p>
<p style="text-align: justify;"><span>Активация последнего слоя выполняется с помощью функции softmax.<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_2.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span><em>Рисунок 2. Характеристики двухслойной модели<br />
</em></span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_3.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span><em>Рисунок 3. Предсказание нейронной сети<br />
</em></span></p>
<p style="text-align: center;"><span><em>С помощью функции summary просматриваются все характеристики полученной трехслойной модели (рисунок 5).<br />
</em></span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_4.png" alt="" /><span><em><br />
</em></span></p>
<p style="text-align: center;"><span><em>Рисунок 4. Характеристики трехслойной модели<br />
</em></span></p>
<p><span>Полносвязная нейронная сеть недостаточно качественно выполняет работу с изображениями. Прогресс обучения двуслойной нейронной сети (78 %) и трехслойной нейронной сети (79 %) растет достаточно медленно, за счет увеличения количества слоев. Более качественный результат можно получить лишь, построив сверточную нейронную сеть.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_5.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span><em>Рисунок 5. Характеристики сверточной нейронной сети<br />
</em></span></p>
<p style="text-align: justify;"><span>Для распознавания дальнейших изображений используется метод predict, который позволяет распознавать, а далее выводить распознанные и истинные объекты. Подготовим в Paint собственные изображения и загрузим их на гугл-диск (рисунок 6)<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1510_6.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span><em>Рисунок 6. Собственные изображения для проверки работы нейронной сети<br />
</em></span></p>
<p style="text-align: center;"><span><em>По итогам распознавания собственных изображений можно сделать следующий вывод (таблица 1):<br />
</em></span></p>
<p style="text-align: left;"><span><em>Таблица 1. Качество распознавания собственных изображений<br />
</em></span></p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 328px;" />
<col style="width: 328px;" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 1pt;">
<p style="text-align: center;"><span><em>Структура НС</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 1pt; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>Качество распознавания</em></span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>Полносвязная нейронная сеть из двух слоев </em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>99.85 %</em></span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>Полносвязная нейронная сеть из трех слоев: </em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>99.72 %</em></span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 1pt; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>Сверточная нейронная сеть с двумя сверточными слоями</em></span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 1pt; border-right: solid 1pt;">
<p style="text-align: center;"><span><em>99.94 %</em></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: justify;"><span><em>Статья посвящена моделированию сверточной нейронной сети для классификации изображений. В результате ее выполнения был спроектирован, реализован и протестирован скрипт на языке программирования Python, с использованием библиотеки Tensorflow, позволяющий распознать на изображении геометрические фигуры и перевести распознанные на изображении данные в массив.<br />
</em></span></p>
<p style="text-align: justify;"><span><em>Для тестирования работоспособности нейронных сетей на вход системы подавались изображения. По окончании обучения каждой нейронной сети были получены данные, необходимые для сравнения работоспособности каждой сети, построены графики, показывающие эффективность увеличения количества слоев в нейронных сетях.<br />
</em></span></p>
<p style="text-align: justify;"><span><em>По результатам полученных данных были выявлены положительные стороны нейронных сетей и их недостатки, а также предложены варианты улучшения.</em></span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2024/06/102172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Авторизация без регистрации</title>
		<link>https://web.snauka.ru/issues/2025/12/104000</link>
		<comments>https://web.snauka.ru/issues/2025/12/104000#comments</comments>
		<pubDate>Wed, 17 Dec 2025 13:53:31 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[авторизация]]></category>
		<category><![CDATA[авторизация без регистрации]]></category>
		<category><![CDATA[регистрация]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/12/104000</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал &#160; Введение: почему пользователи ненавидят регистрацию Мы все были в такой ситуации: нашли интересный сервис, хотите попробовать, но перед вами форма регистрации с десятком полей. 67% пользователей покидают сайт при виде сложной формы регистрации. Что если есть способ обойти этот барьер? Авторизация без регистрации [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p>&nbsp;</p>
<p><em>Введение: почему пользователи ненавидят регистрацию</em></p>
<p>Мы все были в такой ситуации: нашли интересный сервис, хотите попробовать, но перед вами форма регистрации с десятком полей. 67% пользователей покидают сайт при виде сложной формы регистрации. Что если есть способ обойти этот барьер?</p>
<p>Авторизация без регистрации — это инновационный подход, который меняет парадигму взаимодействия пользователя с системой. Давайте разберемся, как это работает и когда стоит применять.</p>
<p>Что такое авторизация без регистрации?</p>
<p>Основная концепция</p>
<p>Авторизация без регистрации — это процесс, при котором пользователь получает доступ к системе без предварительного создания учетной записи. Система самостоятельно генерирует уникальные учетные данные и предоставляет их пользователю.</p>
<p>Классический vs Современный подход</p>
<p>| Традиционная модель | Модель без регистрации |</p>
<p>Регистрация → Подтверждение → Авторизация | Получение доступа → Использование |</p>
<p>Требует активных действий | Пассивное получение доступа |</p>
<p>Высокий порог входа | Мгновенный доступ |</p>
<p>Техническая реализация: от теории к практике</p>
<p>&nbsp;</p>
<p>Архитектура системы</p>
<p>&#8220;`sql</p>
<p>&#8211; Оптимизированная таблица пользователей</p>
<p>CREATE TABLE users (</p>
<p style="padding-left: 30px;">id INT PRIMARY KEY AUTO_INCREMENT,</p>
<p style="padding-left: 30px;">username VARCHAR(100) UNIQUE NOT NULL,</p>
<p style="padding-left: 30px;">password_hash VARCHAR(255) NOT NULL,</p>
<p style="padding-left: 30px;">user_type ENUM(&#8216;guest&#8217;, &#8216;full&#8217;) DEFAULT &#8216;guest&#8217;,</p>
<p style="padding-left: 30px;">created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</p>
<p style="padding-left: 30px;">last_login TIMESTAMP NULL,</p>
<p style="padding-left: 30px;">expires_at TIMESTAMP NULL,</p>
<p style="padding-left: 30px;">is_active BOOLEAN DEFAULT TRUE,</p>
<p style="padding-left: 30px;">INDEX idx_username (username),</p>
<p style="padding-left: 30px;">INDEX idx_expires (expires_at),</p>
<p style="padding-left: 30px;">INDEX idx_user_type (user_type)</p>
<p>);</p>
<p>&#8220;`</p>
<pre>&nbsp;Генерация&nbsp;временных&nbsp;учетных&nbsp;записей
```php
&lt;?php
class&nbsp;TemporaryUserGenerator&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$guest_lifetime&nbsp;=&nbsp;'7&nbsp;DAYS';&nbsp;//&nbsp;Срок&nbsp;жизни&nbsp;гостевого&nbsp;аккаунта
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct(PDO&nbsp;$db)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db&nbsp;=&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;generateGuestUser():&nbsp;array&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Генерация&nbsp;уникательного&nbsp;идентификатора
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$username&nbsp;=&nbsp;$this-&gt;generateUniqueUsername();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$plain_password&nbsp;=&nbsp;$this-&gt;generateStrongPassword();
&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;$password_hash&nbsp;=&nbsp;password_hash($plain_password,&nbsp;PASSWORD_DEFAULT);
&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;$expires_at&nbsp;=&nbsp;date('Y-m-d&nbsp;H:i:s',&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtotime("+{$this-&gt;guest_lifetime}"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt&nbsp;=&nbsp;$this-&gt;db-&gt;prepare(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"INSERT&nbsp;INTO&nbsp;users&nbsp;(username,&nbsp;password_hash,&nbsp;user_type,&nbsp;expires_at)&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUES&nbsp;(?,&nbsp;?,&nbsp;'guest',&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;$stmt-&gt;execute([$username,&nbsp;$password_hash,&nbsp;$expires_at]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'success'&nbsp;=&gt;&nbsp;true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'user_id'&nbsp;=&gt;&nbsp;$this-&gt;db-&gt;lastInsertId(),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'username'&nbsp;=&gt;&nbsp;$username,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'password'&nbsp;=&gt;&nbsp;$plain_password,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'expires_at'&nbsp;=&gt;&nbsp;$expires_at
&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;catch&nbsp;(PDOException&nbsp;$e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_log("Error&nbsp;creating&nbsp;guest&nbsp;user:&nbsp;"&nbsp;.&nbsp;$e-&gt;getMessage());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;['success'&nbsp;=&gt;&nbsp;false,&nbsp;'error'&nbsp;=&gt;&nbsp;'User&nbsp;creation&nbsp;failed'];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;generateUniqueUsername():&nbsp;string&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$prefix&nbsp;=&nbsp;"guest";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$timestamp&nbsp;=&nbsp;time();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$random&nbsp;=&nbsp;bin2hex(random_bytes(4));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"{$prefix}_{$timestamp}_{$random}";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;generateStrongPassword():&nbsp;string&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$length&nbsp;=&nbsp;12;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chars&nbsp;=&nbsp;'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&amp;*';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;substr(str_shuffle($chars),&nbsp;0,&nbsp;$length);
&nbsp;&nbsp;&nbsp;&nbsp;}
}
```
```
&nbsp;Умная&nbsp;форма&nbsp;авторизации&nbsp;с&nbsp;гостевым&nbsp;доступом
```html
&lt;!DOCTYPE&nbsp;html&gt;
&lt;html&nbsp;lang="ru"&gt;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;charset="UTF-8"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;name="viewport"&nbsp;content="width=device-width,&nbsp;initial-scale=1.0"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Быстрый&nbsp;доступ&nbsp;к&nbsp;системе&lt;/title&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.auth-container&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-width:&nbsp;400px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;50px&nbsp;auto;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;30px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;#ddd;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;10px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-shadow:&nbsp;0&nbsp;2px&nbsp;10px&nbsp;rgba(0,0,0,0.1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.form-group&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.form-group&nbsp;label&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;block;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;5px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;bold;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.form-group&nbsp;input&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;100%;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;10px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;#ccc;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;5px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-sizing:&nbsp;border-box;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;12px&nbsp;24px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;none;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;5px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor:&nbsp;pointer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;16px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transition:&nbsp;background-color&nbsp;0.3s;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-primary&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#007bff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;white;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-primary:hover&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#0056b3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-secondary&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#6c757d;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;white;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-left:&nbsp;10px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-secondary:hover&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#545b62;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.guest-access&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-top:&nbsp;30px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding-top:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-top:&nbsp;1px&nbsp;solid&nbsp;#eee;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text-align:&nbsp;center;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class="auth-container"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Вход&nbsp;в&nbsp;систему&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Традиционная&nbsp;форма&nbsp;авторизации&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&nbsp;id="loginForm"&nbsp;action="login_handler.php"&nbsp;method="POST"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class="form-group"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for="username"&gt;Логин:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="text"&nbsp;id="username"&nbsp;name="username"&nbsp;required&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class="form-group"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for="password"&gt;Пароль:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="password"&nbsp;id="password"&nbsp;name="password"&nbsp;required&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;type="submit"&nbsp;class="btn&nbsp;btn-primary"&gt;Войти&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Гостевой&nbsp;доступ&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class="guest-access"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h3&gt;Нет&nbsp;аккаунта?&lt;/h3&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Получите&nbsp;мгновенный&nbsp;гостевой&nbsp;доступ&lt;/p&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick="getGuestAccess()"&nbsp;class="btn&nbsp;btn-secondary"&gt;
&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;&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;async&nbsp;function&nbsp;getGuestAccess()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;response&nbsp;=&nbsp;await&nbsp;fetch('get_guest_access.php',&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'POST',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers:&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Content-Type':&nbsp;'application/json',
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;result&nbsp;=&nbsp;await&nbsp;response.json();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result.success)&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;autoLogin(result.username,&nbsp;result.password);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Ошибка&nbsp;получения&nbsp;доступа:&nbsp;'&nbsp;+&nbsp;result.error);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(error)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.error('Error:',&nbsp;error);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Произошла&nbsp;ошибка&nbsp;при&nbsp;получении&nbsp;доступа');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;autoLogin(username,&nbsp;password)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('username').value&nbsp;=&nbsp;username;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('password').value&nbsp;=&nbsp;password;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('loginForm').submit();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
```
Безопасность:&nbsp;главный&nbsp;вызов
&nbsp;Потенциальные&nbsp;риски
1.&nbsp;**Слабые&nbsp;пароли**&nbsp;-&nbsp;автоматическая&nbsp;генерация&nbsp;может&nbsp;создавать&nbsp;уязвимости
2.&nbsp;**Неограниченное&nbsp;создание&nbsp;аккаунтов**&nbsp;-&nbsp;риск&nbsp;DDoS-атак
3.&nbsp;**Анонимность**&nbsp;-&nbsp;сложность&nbsp;отслеживания&nbsp;злоумышленников
&nbsp;Меры&nbsp;защиты
```php
&lt;?php
class&nbsp;SecurityManager&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;__construct(PDO&nbsp;$db)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db&nbsp;=&nbsp;$db;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Ограничение&nbsp;создания&nbsp;аккаунтов&nbsp;с&nbsp;одного&nbsp;IP
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;checkRateLimit(string&nbsp;$ip):&nbsp;bool&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt&nbsp;=&nbsp;$this-&gt;db-&gt;prepare(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;COUNT(*)&nbsp;as&nbsp;count&nbsp;FROM&nbsp;user_creation_log&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;ip_address&nbsp;=&nbsp;?&nbsp;AND&nbsp;created_at&nbsp;&gt;&nbsp;DATE_SUB(NOW(),&nbsp;INTERVAL&nbsp;1&nbsp;HOUR)"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute([$ip]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$stmt-&gt;fetch(PDO::FETCH_ASSOC);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result['count']&nbsp;&lt;&nbsp;10;&nbsp;//&nbsp;Максимум&nbsp;10&nbsp;аккаунтов&nbsp;в&nbsp;час
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Валидация&nbsp;сложности&nbsp;пароля
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;validatePasswordStrength(string&nbsp;$password):&nbsp;bool&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$min_length&nbsp;=&nbsp;8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$has_uppercase&nbsp;=&nbsp;preg_match('/[A-Z]/',&nbsp;$password);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$has_lowercase&nbsp;=&nbsp;preg_match('/[a-z]/',&nbsp;$password);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$has_numbers&nbsp;=&nbsp;preg_match('/[0-9]/',&nbsp;$password);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$has_special&nbsp;=&nbsp;preg_match('/[!@#$%^&amp;*(),.?":{}|&lt;&gt;]/',&nbsp;$password);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;strlen($password)&nbsp;&gt;=&nbsp;$min_length&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;$has_uppercase&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;$has_lowercase&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;$has_numbers&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;$has_special;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Очистка&nbsp;просроченных&nbsp;аккаунтов
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;cleanupExpiredAccounts():&nbsp;int&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt&nbsp;=&nbsp;$this-&gt;db-&gt;prepare(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DELETE&nbsp;FROM&nbsp;users&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;user_type&nbsp;=&nbsp;'guest'&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;expires_at&nbsp;&lt;&nbsp;NOW()&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;last_login&nbsp;IS&nbsp;NULL"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$stmt-&gt;execute();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$stmt-&gt;rowCount();
&nbsp;&nbsp;&nbsp;&nbsp;}
}
```</pre>
<p>Реальные кейсы применения</p>
<p>1. Демо-версии SaaS продуктов</p>
<p>**Проблема:** Пользователи хотят протестировать функционал перед покупкой</p>
<p>**Решение:** Гостевой доступ с ограниченным временем действия</p>
<p>&nbsp;</p>
<p>2. Образовательные платформы</p>
<p>**Проблема:** Студенты не хотят регистрироваться для разового занятия</p>
<p>**Решение:** Временные коды доступа для участников мероприятия</p>
<p>&nbsp;</p>
<p>3. Корпоративные порталы</p>
<p>**Проблема:** Внешние консультанты нуждаются во временном доступе</p>
<p>**Решение:** Пригласительные ссылки с автоматическим созданием аккаунта</p>
<p>## Преимущества и недостатки</p>
<p><em>Преимущества</em></p>
<p>Для пользователя:</p>
<p>- Мгновенный доступ к сервису</p>
<p>- Отсутствие барьеров входа</p>
<p>- Сохранение анонимности при необходимости</p>
<p>Для бизнеса:</p>
<p>- Увеличение конверсии посетителей в пользователей</p>
<p>- Снижение bounce rate</p>
<p>- Упрощение процесса онбординга</p>
<p><em>Недостатки:</em></p>
<p>Технические:</p>
<p>- Сложность управления временными аккаунтами</p>
<p>- Потенциальные проблемы с безопасностью</p>
<p>- Нагрузка на базу данных</p>
<p>Бизнес-риски:</p>
<p>- Сложность коммуникации с пользователями</p>
<p>- Ограничения персонализации</p>
<p>- Возможность злоупотреблений</p>
<p><strong>Заключение</strong></p>
<p>Авторизация без регистрации — это мощный инструмент, который может значительно улучшить пользовательский опыт, но требует тщательной проработки вопросов безопасности.</p>
<p>Ключевые выводы:</p>
<p>- Идеально подходит для сервисов, где важна скорость первого контакта</p>
<p>- Требует продуманной системы безопасности и мониторинга</p>
<p>- Должна сочетаться с механизмами постепенной регистрации</p>
<p>- Эффективность зависит от конкретного use case</p>
<p>Внедряя эту технологию, вы снимаете барьеры на пути пользователя, но берете на себя ответственность за управление временными идентификациями. Правильный баланс между удобством и безопасностью — залог успеха.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/12/104000/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Погружение в мир спортивного туризма</title>
		<link>https://web.snauka.ru/issues/2026/02/104179</link>
		<comments>https://web.snauka.ru/issues/2026/02/104179#comments</comments>
		<pubDate>Fri, 06 Feb 2026 10:13:12 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[13.00.00 ПЕДАГОГИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[активный отдых]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[здоровье]]></category>
		<category><![CDATA[природные ландшафты]]></category>
		<category><![CDATA[психика]]></category>
		<category><![CDATA[спортивный туризм]]></category>
		<category><![CDATA[устойчивый туризм]]></category>
		<category><![CDATA[экология]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/02/104179</guid>
		<description><![CDATA[Актуальность. Актуальность темы обусловлена растущим интересом к активному отдыху и здоровому образу жизни среди населения. Спортивный туризм привлекает всё больше людей, стремящихся испытать новые ощущения, укрепить своё здоровье и открыть для себя неизведанные уголки природы. В то же время, вопросы безопасности и охраны окружающей среды становятся всё более важными в контексте развития данного вида деятельности. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Актуальность.</strong> Актуальность темы обусловлена растущим интересом к активному отдыху и здоровому образу жизни среди населения. Спортивный туризм привлекает всё больше людей, стремящихся испытать новые ощущения, укрепить своё здоровье и открыть для себя неизведанные уголки природы. В то же время, вопросы безопасности и охраны окружающей среды становятся всё более важными в контексте развития данного вида деятельности. Исследование особенностей спортивного туризма, его влияния на здоровье и психику участников, а также анализ существующих проблем безопасности и экологии позволяют лучше понять этот феномен и предложить пути его дальнейшего развития.</p>
<p><strong>Цель.</strong> Целью данной статьи является всестороннее рассмотрение спортивного туризма как формы активного отдыха, выявление его основных видов, анализа влияния на здоровье и психическое состояние участников, а также определение проблем безопасности и экологии, связанных с этим видом деятельности. На основе проведенного анализа планируется выработать рекомендации по дальнейшему развитию спортивного туризма с учётом интересов как участников, так и окружающей среды.</p>
<p><strong>Результаты исследований.</strong></p>
<ol>
<li>Спортивный туризм зародился в конце XIX века и получил широкую поддержку в XX веке, особенно в СССР, где была создана сеть туристских клубов и секций.</li>
<li>Современный спортивный туризм включает разнообразные направления, такие как горный, водный, пешеходный, велосипедный и спелеотуризм, каждое из которых предъявляет свои требования к участникам.</li>
<li>Спортивный туризм позитивно влияет на физическое и психическое здоровье, улучшая выносливость, мышечную силу, снижая стресс и повышая уверенность в себе.</li>
<li>Для безопасного и экологически ответственного участия в спортивном туризме необходимо соблюдать правила безопасности, использовать качественное снаряжение и минимизировать негативное воздействие на природу.</li>
</ol>
<p><strong>Введение</strong></p>
<p>Спортивный туризм представляет собой уникальную форму активного отдыха, которая сочетает физическую активность, приключенческий дух и исследование природных ландшафтов. Этот вид деятельности становится все более популярным среди людей разных возрастов и профессий, поскольку он позволяет сочетать любовь к спорту с возможностью побывать в отдаленных уголках природы.</p>
<p><strong>История развития спортивного туризма</strong></p>
<p>Исторически спортивный туризм зародился в конце XIX века, когда люди начали активно исследовать горные районы Европы и Америки. Одним из первых примеров является восхождение на Монблан в Альпах в 1786 году, которое считается началом альпинизма как вида спорта. С тех пор популярность горных походов, скалолазания и других видов активного отдыха стремительно росла. В XX веке развитие технологий позволило создать специализированное снаряжение и оборудование, что значительно расширило возможности для занятий спортивным туризмом.</p>
<p>В СССР спортивный туризм получил широкое распространение благодаря государственной поддержке и развитию сети туристских клубов и секций. В 1950-х годах были организованы первые всесоюзные соревнования по спортивному туризму, а в 1960-е годы появились официальные правила проведения соревнований и классификация маршрутов.</p>
<p><strong>Основные виды спортивного туризма</strong></p>
<p>Современный спортивный туризм включает множество различных направлений:</p>
<ol>
<li>Горный туризм – включает пешие походы по горам, восхождения на вершины, прохождение перевалов и ледников. Горный туризм требует хорошей физической подготовки и специальных навыков.</li>
<li>Водный туризм – охватывает такие виды активности, как рафтинг, каякинг, сплав на байдарках и катамаранах. Водный туризм может проходить как по рекам с бурными порогами, так и по спокойным водоемам.</li>
<li>Пешеходный туризм – подразумевает длительные пешие маршруты по природным территориям, часто с ночевками в палатках. Пешеходный туризм доступен людям разного уровня подготовки.</li>
<li>Велосипедный туризм – предполагает путешествия на велосипеде по различным маршрутам, от лесных троп до горных дорог. Он может быть как самостоятельным видом активности, так и частью комбинированных туров, включающих другие виды транспорта.</li>
<li>Спелеотуризм – заключается в исследовании пещер и подземных ходов. Спелеотуризм требует специальной подготовки и оборудования, так как условия в пещерах могут быть экстремальными.</li>
</ol>
<p><strong>Влияние спортивного туризма на здоровье и психику</strong></p>
<p>Занятия спортивным туризмом укрепляют сердечно-сосудистую систему, повышают выносливость и мышечную силу, снижают стресс и улучшают настроение. Участие в спортивных турах развивает уверенность в себе, ответственность и навыки работы в команде.</p>
<p>Однако следует помнить о возможных рисках, связанных с занятиями спортивным туризмом. Неправильная подготовка или недостаточная физическая форма могут привести к травмам и другим неприятностям.</p>
<p><strong>Проблемы безопасности и экологии</strong></p>
<p>Соблюдение правил безопасности и использование качественного снаряжения критичны в спортивном туризме, особенно в горных и водных видах, где ошибки могут иметь серьёзные последствия. Экологические вопросы важны: участники должны минимизировать воздействие на природу, правильно обращаться с отходами, защищать флору и фауну, уважать культурные и исторические объекты.</p>
<p><strong>Выводы.</strong> Спортивный туризм важен для современного активного отдыха, совмещающего физическую активность и исследование природы. Он полезен для здоровья и психики, развивает личностные качества и социальную адаптацию. Но для его успешного развития необходимы меры по обеспечению безопасности и охране окружающей среды. Рекомендуется улучшать подготовку участников, качество снаряжения и контроль за соблюдением экологических стандартов, чтобы сохранить природу для будущих поколений.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/02/104179/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Прогнозирование выживаемости пассажиров Титаника с использованием нейронных сетей</title>
		<link>https://web.snauka.ru/issues/2026/03/104341</link>
		<comments>https://web.snauka.ru/issues/2026/03/104341#comments</comments>
		<pubDate>Sat, 07 Mar 2026 07:37:13 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[Keras]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[Titanic]]></category>
		<category><![CDATA[Классификация]]></category>
		<category><![CDATA[машинное обучение]]></category>
		<category><![CDATA[нейронные сети]]></category>
		<category><![CDATA[предобработка данных]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/03/104341</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение В современном мире методы машинного обучения и искусственного интеллекта находят широкое применение в самых различных областях, включая медицину, финансы, транспорт и многие другие. Одной из классических задач, используемых для обучения и отработки навыков работы с алгоритмами машинного обучения, является задача предсказания выживаемости пассажиров [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p><strong>Введение</strong></p>
<p>В современном мире методы машинного обучения и искусственного интеллекта находят широкое применение в самых различных областях, включая медицину, финансы, транспорт и многие другие. Одной из классических задач, используемых для обучения и отработки навыков работы с алгоритмами машинного обучения, является задача предсказания выживаемости пассажиров Титаника. Данная задача представляет собой бинарную классификацию, где необходимо на основе набора признаков о пассажире определить, выжил он или нет.</p>
<p><strong>Инструментарий</strong></p>
<p>В качестве инструментария для решения поставленной задачи была выбрана библиотека TensorFlow с высокоуровневым фреймворком Keras, которые предоставляют удобные средства для создания и обучения нейронных сетей различной архитектуры. Для работы с табличными данными используется библиотека Pandas, для математических операций и работы с массивами – NumPy, для визуализации результатов – Matplotlib.</p>
<p><strong>Загрузка данных</strong></p>
<p>Поскольку работа выполнялась в среде Google Colab, потребовалось подключение Google Drive для доступа к файлам датасета:</p>
<p style="padding-left: 30px;"><em>from google.colab import drive</em></p>
<p style="padding-left: 30px;"><em>drive.mount(&#8216;/content/drive/&#8217;)</em></p>
<p>Путь к данным задается через переменную PATH, после чего загружаются тренировочный и тестовый наборы данных, а также файл с примером формата ответов sample_submission.csv:</p>
<p style="padding-left: 30px;"><em>DIR = &#8220;Titanic&#8221;</em></p>
<p style="padding-left: 30px;"><em>PATH = &#8216;/content/drive/My Drive/&#8217;+ DIR + &#8216;/&#8217;</em></p>
<p style="padding-left: 30px;"><em> </em></p>
<p style="padding-left: 30px;"><em>train = pd.read_csv(PATH + &#8216;train.csv&#8217;)</em></p>
<p style="padding-left: 30px;"><em>test = pd.read_csv(PATH + &#8216;test.csv&#8217;)</em></p>
<p style="padding-left: 30px;"><em>sample_submission = pd.read_csv(PATH + &#8216;sample_submission.csv&#8217;, index_col=&#8217;PassengerId&#8217;)</em></p>
<p><strong>Предобработка данных</strong></p>
<p>Одной из важнейших задач при работе с реальными данными является их предобработка. Исходные данные содержат как числовые, так и категориальные признаки, которые необходимо преобразовать в формат, пригодный для обучения нейронной сети.</p>
<p><strong>Замена категориальных признаков</strong></p>
<p>В первую очередь производится замена текстовых значений пола на числовые:</p>
<p style="padding-left: 30px;"><em>train = train.replace(&#8216;male&#8217;, 1).replace(&#8216;female&#8217;, 0)</em></p>
<p style="padding-left: 30px;"><em>test = test.replace(&#8216;male&#8217;, 1).replace(&#8216;female&#8217;, 0)</em></p>
<p><strong>Создание дамми-переменных</strong></p>
<p>Далее создаются дамми-переменные для категориальных признаков Embarked (порт посадки) и Pclass (класс билета), что позволяет представить эти признаки в виде бинарных векторов:</p>
<p style="padding-left: 30px;"><em>train = pd.concat([train, pd.get_dummies(train.Embarked, prefix="Emb")], axis=1)</em></p>
<p style="padding-left: 30px;"><em>train = pd.concat([train, pd.get_dummies(train.Pclass, prefix="Pclass")], axis=1)</em></p>
<p style="padding-left: 30px;"><em> </em></p>
<p style="padding-left: 30px;"><em>test = pd.concat([test, pd.get_dummies(test.Embarked, prefix="Emb")], axis=1)</em></p>
<p style="padding-left: 30px;"><em>test = pd.concat([test, pd.get_dummies(test.Pclass, prefix="Pclass")], axis=1)</em></p>
<p><strong>Создание новых признаков</strong></p>
<p>Важным этапом инженерного анализа данных является создание новых признаков, которые могут нести дополнительную информацию для модели. На основе имеющихся признаков Parch (количество родителей и детей) и SibSp (количество братьев, сестер, супругов) был создан новый бинарный признак &#8220;наличие более одного родственника&#8221;, принимающий значение 1, если у пассажира было более одного родственника на борту, и 0 в противном случае.</p>
<p style="padding-left: 30px;"><em>train['more than one relative'] = train.Parch + train.SibSp &gt; 1</em></p>
<p style="padding-left: 30px;"><em>train = train.replace(True, 1).replace(False, 0)</em></p>
<p style="padding-left: 30px;"><em> </em></p>
<p style="padding-left: 30px;"><em>test['more than one relative'] = test.Parch + test.SibSp &gt; 1</em></p>
<p style="padding-left: 30px;"><em>test = test.replace(True, 1).replace(False, 0)</em></p>
<p><strong>Анализ пропущенных значений</strong></p>
<p>Производится анализ пропущенных значений с помощью методов isnull().sum():</p>
<p style="padding-left: 30px;"><em>train</em><em>.</em><em>isnull</em><em>().</em><em>sum</em><em>()</em></p>
<p>Для визуализации используется тепловая карта библиотеки Seaborn, что позволяет наглядно увидеть, в каких колонках присутствуют пропуски:</p>
<p style="padding-left: 30px;"><em>import</em><em> </em><em>seaborn</em><em> </em><em>as</em><em> </em><em>sns</em><em></em></p>
<p style="padding-left: 30px;"><em>sns</em><em>.</em><em>heatmap</em><em>(</em><em>train</em><em>.</em><em>isnull</em><em>(), </em><em>cbar</em><em> = </em><em>False</em><em>).</em><em>set</em><em>_</em><em>title</em><em>(&#8220;Карта пропущенных значений&#8221;)</em></p>
<p><strong>Заполнение пропусков</strong></p>
<p>На основе анализа принимается решение о заполнении пропущенных значений. Для числовых колонок Age и Fare пропуски заменяются средними значениями:</p>
<p style="padding-left: 30px;"><em>numeric_cols = ['Age', 'Fare']</em></p>
<p style="padding-left: 30px;"><em>train[numeric_cols] = train[numeric_cols].fillna(train[numeric_cols].mean())</em></p>
<p style="padding-left: 30px;"><em>test[numeric_cols] = test[numeric_cols].fillna(train[numeric_cols].mean())</em></p>
<p>При этом важно отметить, что для заполнения пропусков в тестовом наборе используются средние значения, вычисленные на тренировочном наборе, чтобы избежать утечки данных.</p>
<p><strong>Формирование признакового пространства</strong></p>
<p>После завершения предобработки формируется список признаков features и целевая переменная target:</p>
<p style="padding-left: 30px;"><em>features = ['Pclass_1', 'Pclass_2', 'Pclass_3', 'Age', 'Sex', 'Fare', 'more than one relative', 'Emb_C', 'Emb_Q', 'Emb_S']</em></p>
<p style="padding-left: 30px;"><em>target = &#8216;Survived&#8217;</em></p>
<p>Данные преобразуются в массивы NumPy для подачи в нейронную сеть:</p>
<p style="padding-left: 30px;"><em>X_train = train[features].values</em></p>
<p style="padding-left: 30px;"><em>Y_train = train[target].values</em></p>
<p style="padding-left: 30px;"><em>X_test = test[features].values</em></p>
<p><strong>Нормализация данных</strong></p>
<p>Важным этапом подготовки данных является нормализация, которая позволяет привести все признаки к единому масштабу и ускорить процесс обучения нейронной сети. Нормализация производится путем вычитания среднего значения и деления на стандартное отклонение:</p>
<p style="padding-left: 30px;"><em>mean = X_train.mean(axis=0)</em></p>
<p style="padding-left: 30px;"><em>std = X_train.std(axis=0)</em></p>
<p style="padding-left: 30px;"><em>X_train = X_train &#8211; mean</em></p>
<p style="padding-left: 30px;"><em>X_train /= std</em></p>
<p style="padding-left: 30px;"><em>X_test = X_test &#8211; mean</em></p>
<p style="padding-left: 30px;"><em>X_test /= std</em></p>
<p><strong>Построение модели нейронной сети</strong></p>
<p>Для построения модели используется последовательная архитектура Sequential с импортом необходимых слоев:</p>
<p style="padding-left: 30px;"><em>from tensorflow.keras.models import Sequential</em></p>
<p style="padding-left: 30px;"><em>from tensorflow.keras.layers import Dense, Dropout</em></p>
<p>Модель состоит из трех полносвязных слоев. Первый слой содержит 200 нейронов с функцией активации ReLU и принимает на вход данные размерности, соответствующей количеству признаков. Второй скрытый слой содержит 20 нейронов также с функцией активации ReLU. Выходной слой содержит один нейрон с сигмоидной функцией активации, что позволяет получать на выходе вероятность принадлежности к классу 1 (выживший) в диапазоне от 0 до 1.</p>
<p>Для предотвращения переобучения после каждого скрытого слоя добавляется слой Dropout с вероятностью отключения нейронов 0.1:</p>
<p style="padding-left: 30px;"><em>model = Sequential()</em></p>
<p style="padding-left: 30px;"><em>model.add(Dense(200, activation=&#8217;relu&#8217;, input_shape=(X_train.shape[1],)))</em></p>
<p style="padding-left: 30px;"><em>model.add(Dropout(0.1))</em></p>
<p style="padding-left: 30px;"><em>model.add(Dense(20, activation=&#8217;relu&#8217;))</em></p>
<p style="padding-left: 30px;"><em>model.add(Dropout(0.1))</em></p>
<p style="padding-left: 30px;"><em>model.add(Dense(1, activation=&#8217;sigmoid&#8217;))</em></p>
<p>После создания модели выводится ее краткое описание:</p>
<p style="padding-left: 30px;"><em>print(model.summary())</em></p>
<p><strong>Компиляция модели</strong></p>
<p>Компиляция модели производится с использованием оптимизатора Adam. В качестве функции потерь используется binary_crossentropy, подходящая для бинарной классификации. Метрикой качества выбрана accuracy – доля правильных ответов:</p>
<p style="padding-left: 30px;"><em>model.compile(optimizer=&#8217;adam&#8217;, loss=&#8217;binary_crossentropy&#8217;, metrics=['accuracy'])</em></p>
<p><strong>Обучение модели</strong></p>
<p>Обучение модели производится на тренировочных данных с валидационным разделением 10% от обучающей выборки. Количество эпох обучения установлено равным 2, размер пакета batch_size равен 1:</p>
<p style="padding-left: 30px;"><em>history = model.fit(X_train, Y_train,</em></p>
<p style="padding-left: 60px;"><em>                    epochs=2,</em></p>
<p style="padding-left: 60px;"><em>                    batch_size=1,</em></p>
<p style="padding-left: 60px;"><em>                    validation_split=0.1,</em></p>
<p style="padding-left: 60px;"><em>                    </em><em>verbose=2)</em></p>
<p><strong>Визуализация процесса обучения</strong></p>
<p>Для визуализации процесса обучения строится график изменения точности на обучающем и проверочном наборах данных:</p>
<p style="padding-left: 30px;"><em>plt.plot(history.history['accuracy'], label=&#8217;Точность на обучающем наборе&#8217;)</em></p>
<p style="padding-left: 30px;"><em>plt.plot(history.history['val_accuracy'], label=&#8217;Точность на проверочном наборе&#8217;)</em></p>
<p style="padding-left: 30px;"><em>plt.xlabel(&#8216;Эпоха обучения&#8217;)</em></p>
<p style="padding-left: 30px;"><em>plt.ylabel(&#8216;Точность&#8217;)</em></p>
<p style="padding-left: 30px;"><em>plt.legend()</em></p>
<p style="padding-left: 30px;"><em>plt.show()</em></p>
<p>График позволяет оценить, насколько хорошо модель обучается, и демонстрирует рост точности в процессе обучения.</p>
<p><strong>Предсказание на тестовых данных</strong></p>
<p>После завершения обучения производится предсказание на тестовых данных:</p>
<p style="padding-left: 30px;"><em>predictions = model.predict(X_test)</em></p>
<p>Полученные предсказания представляют собой вероятности принадлежности к классу 1. Для преобразования вероятностей в бинарные метки используется пороговое значение 0.5:</p>
<p style="padding-left: 30px;"><em>sample_submission[target] = [0 if pred &lt; 0.5 else 1 for pred in predictions]</em></p>
<p><strong>Экспорт результатов</strong></p>
<p>Полученные предсказания записываются в файл-образец и сохраняются в файл titanic_submission.csv:</p>
<p style="padding-left: 30px;"><em>sample_submission.to_csv(&#8216;titanic_submission.csv&#8217;)</em></p>
<p>Поскольку работа велась в Google Colab, для загрузки файла на локальный компьютер используется модуль files:</p>
<p style="padding-left: 30px;"><em>from google.colab import files</em></p>
<p style="padding-left: 30px;"><em>files.download(&#8216;titanic_submission.csv&#8217;)</em></p>
<p><strong>Заключение</strong></p>
<p>В результате выполненной работы была построена нейросетевая модель, способная с высокой точностью предсказывать выживаемость пассажиров Титаника на основе предоставленных характеристик. В процессе решения были отработаны ключевые этапы построения модели машинного обучения: загрузка и анализ данных, предобработка и создание новых признаков, заполнение пропусков, нормализация, построение архитектуры нейронной сети с регуляризацией, обучение и оценка качества, формирование предсказаний и экспорт результатов.</p>
<p>Полученный опыт может быть использован для решения других задач классификации и регрессии, а также служить основой для изучения более сложных архитектур нейронных сетей и методов глубокого обучения.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/03/104341/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание трехмерных фигур с помощью WebGL</title>
		<link>https://web.snauka.ru/issues/2026/03/104338</link>
		<comments>https://web.snauka.ru/issues/2026/03/104338#comments</comments>
		<pubDate>Wed, 18 Mar 2026 10:42:28 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[визуализация]]></category>
		<category><![CDATA[геометрические фигуры]]></category>
		<category><![CDATA[интерактивность]]></category>
		<category><![CDATA[конус]]></category>
		<category><![CDATA[призма]]></category>
		<category><![CDATA[цилиндр]]></category>
		<category><![CDATA[шейдеры]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/03/104338</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал WebGL – это программная библиотека для JavaScript, которая позволяет создавать 3D графику, функционирующую в браузерах. Данная библиотека основана на архитектуре OpenGL. WebGL использует язык программирования шейдеров GLSL, имеющий C-подобный синтаксис. Особенность WebGL заключается в том, что код моделируется непосредственно в браузере с использованием элемента [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right">Научный руководитель: <em>Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p>WebGL – это программная библиотека для JavaScript, которая позволяет создавать 3D графику, функционирующую в браузерах. Данная библиотека основана на архитектуре OpenGL. WebGL использует язык программирования шейдеров GLSL, имеющий C-подобный синтаксис. Особенность WebGL заключается в том, что код моделируется непосредственно в браузере с использованием элемента canvas, введенного в HTML5.</p>
<p>Работа с WebGL и шейдерами в частности — довольно трудоемкий процесс, требующий описания каждой точки, линии и грани. Для визуализации необходимо прописывать объемные фрагменты кода. Чтобы ускорить разработку, была создана библиотека Three.js, которая представляет собой набор готовых классов для создания и отображения интерактивной 3D графики. Three.js для WebGL — это как jQuery для JavaScript: библиотека предлагает декларативный синтаксис и абстрагирует разработчика от сложностей, связанных с 3D в браузере.</p>
<p>Для создания сцены с геометрическими фигурами мы использовали современный подход с импортом модулей:</p>
<p><em>javascript</em></p>
<p><em>import * as THREE from &#8216;three&#8217;;</em></p>
<p><em>import { OrbitControls } from &#8216;three/addons/controls/OrbitControls.js&#8217;;</em></p>
<p><em> </em></p>
<p>Такой способ подключения (с использованием import maps) является более чистым и предпочтительным в современных веб-приложениях.</p>
<p>Инициализация сцены и основных компонентов</p>
<p>Первым шагом мы создаем сцену, камеру и рендерер:</p>
<p>javascript</p>
<p>const container = document.createElement(&#8216;div&#8217;);</p>
<p>document.body.appendChild(container);</p>
<p>&nbsp;</p>
<p>camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 5000);</p>
<p>camera.position.set(300, 500, 1200);</p>
<p>&nbsp;</p>
<p>renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p>renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p>container.appendChild(renderer.domElement);</p>
<p>Камера установлена на оптимальном расстоянии (1200 единиц), чтобы хорошо видеть оба ряда фигур. Параметр antialias включает сглаживание для более плавных краев объектов.</p>
<p><strong>Освещение сцены</strong></p>
<p>Для корректного отображения цветов и теней мы добавили два типа освещения:</p>
<p><em>javascript</em></p>
<p><em>ambientLight = new THREE.AmbientLight(0&#215;404040, 2.0);</em></p>
<p><em>light = new THREE.DirectionalLight(0xffffff, 1.5);</em></p>
<p><em>light.position.set(1, 2, 1);</em></p>
<p>Фоновый свет (AmbientLight) обеспечивает базовое освещение всех поверхностей, а направленный свет (DirectionalLight) создает объем и подчеркивает форму объектов.</p>
<p><strong>Управление камерой</strong></p>
<p>Для интерактивного взаимодействия с пользователем подключены контроллеры OrbitControls, позволяющие вращать камеру вокруг сцены, приближать и отдалять изображение:</p>
<p><em>javascript</em></p>
<p><em>controls = new OrbitControls(camera, renderer.domElement);</em></p>
<p><em>controls.rotateSpeed = 0.5;</em></p>
<p><em>controls.enableZoom = true;</em></p>
<p><em>controls.minDistance = 300;</em></p>
<p><em>controls.maxDistance = 2000;</em></p>
<p><em>controls.enableDamping = true;</em></p>
<p><strong>Размещение фигур в пространстве</strong></p>
<p>Для организации фигур мы использовали Декартову систему координат и расположили объекты в два ряда. Каждая фигура имеет свои координаты position.set(x, y, z):</p>
<p><em>javascript</em></p>
<p><em>// Параметры расположения</em></p>
<p><em>const spacingX = 300;       // расстояние между фигурами по X</em></p>
<p><em>const startX = -450;        // начальная координата X</em></p>
<p><em>const row1Z = -200;         // координата Z для первого ряда (задний)</em></p>
<p><em>const row2Z = 200;          // координата Z для второго ряда (передний)</em></p>
<p><strong>Создание геометрических фигур</strong></p>
<p>В нашей сцене представлены различные типы геометрических тел, созданные с помощью встроенных классов Three.js:</p>
<p><strong>1. </strong><strong>Прямоугольник (BoxGeometry)</strong></p>
<p><em>javascript</em></p>
<p><em>const geomBox = new THREE.BoxGeometry(300, 200, 220);</em></p>
<p><em>const box = new THREE.Mesh(geomBox, new THREE.MeshPhongMaterial({ color: 0xFFFF00 }));</em></p>
<p><strong>2. Цилиндры и призмы (CylinderGeometry)</strong></p>
<p>Класс CylinderGeometry универсален и позволяет создавать различные фигуры путем изменения параметров:</p>
<ul>
<li>Цилиндр (равные радиусы сверху и снизу, много сегментов)</li>
<li>Треугольная призма (равные радиусы, 3 сегмента)</li>
<li>Пятиугольная и шестиугольная призмы (равные радиусы, 5 и 6 сегментов)</li>
</ul>
<p><strong>3. Пирамиды и конусы</strong></p>
<p>Установка верхнего радиуса в 0 превращает цилиндр в пирамиду или конус:</p>
<ul>
<li>Четырехугольная пирамида (верхний радиус 0, 4 сегмента)</li>
<li>Шестиугольная пирамида (верхний радиус 0, 6 сегментов)</li>
<li>Конус (верхний радиус 0, много сегментов для гладкости)</li>
</ul>
<p><strong>Цветовое оформление</strong></p>
<p>Для каждой фигуры подобран индивидуальный цвет, делающий композицию яркой и наглядной:</p>
<ul>
<li>Желтый прямоугольник (0xFFFF00)</li>
<li>Синий цилиндр (0x0000FF)</li>
<li>Красная треугольная призма (0xFF0000)</li>
<li>Зеленая шестиугольная пирамида (0x00FF00)</li>
<li>Голубая пятиугольная призма (0x87CEEB)</li>
<li>Салатовая четырехугольная пирамида (0x90EE90)</li>
<li>Розовая шестиугольная призма (0xFFC0CB)</li>
<li>Золотой конус (0xFFD700)</li>
</ul>
<p><strong>Визуализация и анимация</strong></p>
<p>Для непрерывной отрисовки сцены используется цикл анимации:</p>
<p><em>javascript</em></p>
<p><em>function animate() {</em></p>
<p style="padding-left: 30px;"><em>    requestAnimationFrame(animate);</em></p>
<p style="padding-left: 30px;"><em>    controls.update();</em></p>
<p style="padding-left: 30px;"><em>    render();</em></p>
<p><em>}</em></p>
<p><em> </em></p>
<p><em>function render() {</em></p>
<p style="padding-left: 30px;"><em>    renderer.render(scene, camera);</em></p>
<p><em>}</em></p>
<p>Обработчик изменения размера окна обеспечивает корректное масштабирование сцены:</p>
<p><em>javascript</em></p>
<p><em>window.addEventListener(&#8216;resize&#8217;, onWindowResize, false);</em></p>
<p><strong>Результат</strong></p>
<p>В результате выполнения кода мы получаем интерактивную 3D-сцену с двумя рядами геометрических фигур (всего 8 объектов), расположенных на сером фоне со вспомогательной сеткой. Пользователь может свободно вращать камеру, приближать и рассматривать каждую фигуру с разных ракурсов, что делает данное решение отличным демонстрационным материалом для изучения возможностей Three.js и WebGL.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-104339" title="ris1" src="https://web.snauka.ru/wp-content/uploads/2026/03/ris11.png" alt="" width="643" height="293" /></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/03/104338/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка мобильного приложения с автозаполнением на платформе Android</title>
		<link>https://web.snauka.ru/issues/2026/03/104386</link>
		<comments>https://web.snauka.ru/issues/2026/03/104386#comments</comments>
		<pubDate>Thu, 26 Mar 2026 09:16:37 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Android Studio]]></category>
		<category><![CDATA[ArrayAdapter]]></category>
		<category><![CDATA[AutoCompleteTextView]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[автозаполнение]]></category>
		<category><![CDATA[мобильное приложение]]></category>
		<category><![CDATA[пользовательский интерфейс]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/03/104386</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение В современном мире мобильные приложения стали неотъемлемой частью повседневной жизни человека. Одним из ключевых аспектов успешного приложения является удобство его использования, включая интуитивно понятные элементы ввода данных. Функция автозаполнения позволяет значительно ускорить процесс ввода информации и снизить количество ошибок со стороны пользователя. В [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p><strong>Введение</strong></p>
<p>В современном мире мобильные приложения стали неотъемлемой частью повседневной жизни человека. Одним из ключевых аспектов успешного приложения является удобство его использования, включая интуитивно понятные элементы ввода данных. Функция автозаполнения позволяет значительно ускорить процесс ввода информации и снизить количество ошибок со стороны пользователя. В операционной системе Android для реализации данной функции предусмотрен специальный элемент интерфейса – AutoCompleteTextView, который представляет собой расширение обычного текстового поля EditText с возможностью отображения выпадающего списка подсказок.</p>
<p>Целью данной работы является создание демонстрационного мобильного приложения, иллюстрирующего принципы работы с AutoCompleteTextView на примере справочника косметических средств. Приложение позволяет пользователю вводить название косметического продукта, получая при этом подсказки из предварительно заданного списка.</p>
<p><strong>Инструментарий и среда разработки</strong></p>
<p>Для разработки приложения использовалась среда Android Studio – официальная интегрированная среда разработки для платформы Android. Приложение написано на языке Java с использованием Android SDK. В качестве целевой платформы выбрана актуальная версия Android с поддержкой библиотеки AndroidX, обеспечивающей обратную совместимость приложения с более ранними версиями операционной системы.</p>
<p><strong>Структура проекта</strong></p>
<p>Проект состоит из двух основных файлов:</p>
<ul>
<li>MainActivity.java – главный класс активности, содержащий логику работы приложения</li>
<li>activity_main.xml – файл разметки, определяющий пользовательский интерфейс</li>
</ul>
<p><strong>Разработка пользовательского интерфейса</strong></p>
<p>Пользовательский интерфейс приложения создается с использованием декларативного подхода в XML-файле разметки. Корневым элементом выступает ConstraintLayout, который обеспечивает гибкое позиционирование дочерних элементов. Внутри него размещается LinearLayout с вертикальной ориентацией, центрирующий содержимое на экране:</p>
<p><em>&lt;androidx.constraintlayout.widget.ConstraintLayout</em></p>
<p style="padding-left: 30px;"><em>    xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;</em></p>
<p style="padding-left: 30px;"><em>    xmlns:app=&#8221;http://schemas.android.com/apk/res-auto&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:id=&#8221;@+id/main&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_width=&#8221;match_parent&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_height=&#8221;match_parent&#8221;&gt;</em></p>
<p style="padding-left: 30px;"><em> </em></p>
<p style="padding-left: 30px;"><em>    &lt;LinearLayout</em></p>
<p style="padding-left: 60px;"><em>        android:layout_width=&#8221;match_parent&#8221;</em></p>
<p style="padding-left: 60px;"><em>        android:layout_height=&#8221;match_parent&#8221;</em></p>
<p style="padding-left: 60px;"><em>        android:orientation=&#8221;vertical&#8221;</em></p>
<p style="padding-left: 60px;"><em>        android:gravity=&#8221;center&#8221;</em></p>
<p style="padding-left: 60px;"><em>        android:padding=&#8221;24dp&#8221;</em></p>
<p style="padding-left: 60px;"><em>        app:layout_constraintBottom_toBottomOf=&#8221;parent&#8221;</em></p>
<p style="padding-left: 60px;"><em>        app:layout_constraintEnd_toEndOf=&#8221;parent&#8221;</em></p>
<p style="padding-left: 60px;"><em>        app:layout_constraintStart_toStartOf=&#8221;parent&#8221;</em></p>
<p style="padding-left: 60px;"><em>        app:layout_constraintTop_toTopOf=&#8221;parent&#8221;&gt;</em><em></em></p>
<p>Интерфейс содержит два основных элемента. Заголовок приложения реализован с помощью TextView с текстом &#8220;Косметика&#8221;, увеличенным размером шрифта 24sp и полужирным начертанием:</p>
<p><em>&lt;TextView</em></p>
<p style="padding-left: 30px;"><em>    android:layout_width=&#8221;wrap_content&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_height=&#8221;wrap_content&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:text=&#8221;Косметика&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:textSize=&#8221;24sp&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:textStyle=&#8221;bold&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_marginBottom=&#8221;32dp&#8221; /&gt;</em></p>
<p>Основной элемент – AutoCompleteTextView с идентификатором autoCompleteTextView2. Ему заданы параметры ширины на весь родительский контейнер, отступы для удобства касания, фон в виде стандартной рамки для редактирования и порог срабатывания автозаполнения, равный одному символу:<strong></strong></p>
<p><em>&lt;AutoCompleteTextView</em></p>
<p style="padding-left: 30px;"><em>    android:id=&#8221;@+id/autoCompleteTextView2&#8243;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_width=&#8221;match_parent&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:layout_height=&#8221;wrap_content&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android</em><em>:</em><em>hint</em><em>=&#8221;Введите название косметики&#8221;</em></p>
<p style="padding-left: 30px;"><em>    </em><em>android:inputType=&#8221;text&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:padding=&#8221;12dp&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android:background=&#8221;@android:drawable/editbox_background&#8221;</em></p>
<p style="padding-left: 30px;"><em>    android</em><em>:</em><em>completionThreshold</em><em>=&#8221;1&#8243; /&gt;</em></p>
<p><strong>Реализация логики приложения</strong></p>
<p>Логика приложения реализована в классе MainActivity, наследующемся от AppCompatActivity. Вначале объявляется массив строк с названиями косметических продуктов, которые будут служить источником данных для автозаполнения:</p>
<p><em>public class MainActivity extends AppCompatActivity {</em></p>
<p><em> </em></p>
<p style="padding-left: 30px;"><em>    String</em><em>[] </em><em>seaFish</em><em> = {</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Мицеллярная вода&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Тоник для лица&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Сыворотка с гиалуроновой кислотой&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Крем для век&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Пилинг-скатка&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Тональный крем&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Консилер&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Тушь для ресниц&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Матовая помада&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Скраб для тела&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Масло для волос&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Шампунь для объёма&#8221;,</em></p>
<p style="padding-left: 60px;"><em>        &#8220;Парфюмированная вода&#8221;</em></p>
<p style="padding-left: 30px;"><em>    </em><em>};</em></p>
<p><em>}</em></p>
<p>Метод onCreate является точкой входа в активность. В нем производится инициализация интерфейса с помощью setContentView, подключение режима EdgeToEdge для использования всей площади экрана и настройка отступов для системных панелей:</p>
<p><em>@Override</em></p>
<p><em>protected void onCreate(Bundle savedInstanceState) {</em></p>
<p style="padding-left: 30px;"><em>    super.onCreate(savedInstanceState);</em></p>
<p style="padding-left: 30px;"><em>    EdgeToEdge.enable(this);</em></p>
<p style="padding-left: 30px;"><em>    setContentView(R.layout.activity_main);</em></p>
<p style="padding-left: 30px;"><em> </em></p>
<p style="padding-left: 30px;"><em>    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -&gt; {</em></p>
<p style="padding-left: 60px;"><em>        Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());</em></p>
<p style="padding-left: 60px;"><em>        v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);</em></p>
<p style="padding-left: 60px;"><em>        return insets;</em></p>
<p style="padding-left: 30px;"><em>    });</em></p>
<p><em>}</em></p>
<p><strong>Настройка AutoCompleteTextView</strong></p>
<p>Ключевым моментом в разработке является правильная настройка элемента автозаполнения. Сначала производится поиск элемента по его идентификатору:</p>
<p><em>AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView2);</em></p>
<p>Важно отметить, что в исходном коде используется идентификатор autoCompleteTextView2, который должен соответствовать идентификатору, указанному в XML-разметке. Это обеспечивает связь между логикой приложения и пользовательским интерфейсом.</p>
<p>Далее создается адаптер массива ArrayAdapter, который связывает данные (массив строк с названиями косметики) с элементом интерфейса. В качестве макета для отображения элементов выпадающего списка используется стандартный системный макет simple_dropdown_item_1line:</p>
<p><em>ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(</em></p>
<p style="padding-left: 30px;"><em>    this,</em></p>
<p style="padding-left: 30px;"><em>    android.R.layout.simple_dropdown_item_1line,</em></p>
<p style="padding-left: 30px;"><em>    seaFish</em></p>
<p><em>);</em></p>
<p>После создания адаптера он устанавливается для AutoCompleteTextView с помощью метода setAdapter. Метод setThreshold(1) определяет минимальное количество символов, которое должен ввести пользователь для появления подсказок. Значение 1 означает, что выпадающий список будет появляться после ввода первого же символа:</p>
<p><em>autoCompleteTextView.setAdapter(adapter);</em></p>
<p><em>autoCompleteTextView.setThreshold(1);</em></p>
<p><em>autoCompleteTextView.setHint(&#8220;Введите название косметики&#8221;);</em></p>
<p><em>autoCompleteTextView</em><em>.</em><em>setText</em><em>(&#8220;&#8221;);</em></p>
<p><strong>Обработка ошибок и проверка наличия элемента</strong></p>
<p>В коде предусмотрена проверка на null для элемента AutoCompleteTextView. Это делается для предотвращения возможных ошибок, если по какой-то причине элемент с указанным идентификатором не будет найден в разметке:</p>
<p><em>if</em><em> (</em><em>autoCompleteTextView</em><em> != </em><em>null</em><em>) {</em></p>
<p style="padding-left: 30px;"><em>    // настройка адаптера и параметров</em></p>
<p><em>}</em></p>
<p><strong>Принцип работы приложения</strong></p>
<p>При запуске приложения пользователь видит экран с заголовком &#8220;Косметика&#8221; и полем ввода с подсказкой &#8220;Введите название косметики&#8221;. Когда пользователь начинает вводить текст, система автоматически фильтрует массив данных и отображает выпадающий список с подходящими вариантами. При выборе одного из вариантов текст автоматически подставляется в поле ввода.</p>
<p>Механизм автозаполнения работает следующим образом: при каждом изменении текста в поле ввода AutoCompleteTextView передает введенный фрагмент адаптеру, который, в свою очередь, фильтрует массив данных, оставляя только те элементы, которые содержат введенную подстроку. Отфильтрованный список отображается в выпадающем окне.</p>
<p><strong>Особенности реализации</strong></p>
<p>В процессе разработки были учтены следующие важные моменты:</p>
<ol>
<li>Использование AndroidX – библиотека обеспечивает совместимость с различными версиями Android и предоставляет современные компоненты интерфейса.</li>
<li>EdgeToEdge – режим позволяет приложению использовать всю область экрана, включая области под системными панелями.</li>
<li>Обработка отступов – правильная настройка отступов гарантирует, что содержимое не будет перекрыто системными элементами (строка состояния, навигационная панель).</li>
<li>Проверка наличия элемента – защита от возможных ошибок при поиске view по идентификатору.</li>
<li>Выбор макета для выпадающего списка – использование системного макета simple_dropdown_item_1line обеспечивает единообразный внешний вид с другими приложениями Android.</li>
</ol>
<p><strong>Результат работы</strong></p>
<p>В результате выполнения работы было создано функционирующее мобильное приложение для Android, демонстрирующее работу элемента AutoCompleteTextView. Приложение позволяет пользователю вводить названия косметических средств с функцией автозаполнения, что ускоряет процесс ввода и исключает возможность орфографических ошибок.</p>
<p>Интерфейс приложения интуитивно понятен и соответствует рекомендациям Material Design. Приложение корректно отображается на различных устройствах благодаря использованию ConstraintLayout и правильной обработке системных отступов.</p>
<p><strong>Заключение</strong></p>
<p>В ходе выполнения работы были изучены и практически применены следующие аспекты Android-разработки:</p>
<ul>
<li>создание пользовательского интерфейса с использованием XML-разметки;</li>
<li>работа с элементом AutoCompleteTextView и его настройка;</li>
<li>использование ArrayAdapter для связывания данных с элементами интерфейса;</li>
<li>обработка системных отступов для корректного отображения на различных экранах;</li>
<li>применение современных библиотек AndroidX.</li>
</ul>
<p>Разработанное приложение может служить основой для более сложных проектов, требующих функционала автозаполнения, например, справочников, каталогов товаров, поисковых систем и других приложений, где пользователю необходимо выбирать значения из заранее известного списка.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/03/104386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
