<?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; author20348</title>
	<atom:link href="http://web.snauka.ru/issues/author/sadretdinov/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/102167</link>
		<comments>https://web.snauka.ru/issues/2024/06/102167#comments</comments>
		<pubDate>Tue, 11 Jun 2024 15:21:19 +0000</pubDate>
		<dc:creator>author20348</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[CNN]]></category>
		<category><![CDATA[Google Colab]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[искусственный интеллект]]></category>
		<category><![CDATA[машинное обучение]]></category>
		<category><![CDATA[нейронные сети]]></category>
		<category><![CDATA[распознавание букв]]></category>
		<category><![CDATA[сверточные нейронные сети]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2024/06/102167</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович Уфимский университет науки и технологий, Нефтекамский филиал, к.ф.-м.н. Современные технологии искусственного интеллекта (ИИ) и машинного обучения (МО) приобретают все большую популярность и находят применение в различных сферах деятельности. Одним из наиболее перспективных направлений является использование нейронных сетей для решения задач распознавания и классификации. В данной статье рассматриваются возможности и методы применения нейронных [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em><em>Уфимский университет науки и технологий, Нефтекамский филиал, </em>к.ф.-м.н.</em></p>
<p style="text-align: justify;"><span>Современные технологии искусственного интеллекта (ИИ) и машинного обучения (МО) приобретают все большую популярность и находят применение в различных сферах деятельности. Одним из наиболее перспективных направлений является использование нейронных сетей для решения задач распознавания и классификации. В данной статье рассматриваются возможности и методы применения нейронных сетей для распознавания согласных букв.<br />
</span></p>
<p style="text-align: justify;"><span>История машинного обучения начинается с середины XX века. В 1952 году Артур Самуэль разработал первую самообучающуюся программу для игры в шашки, что стало отправной точкой в развитии МО. Позже, в 1959 году, он начал работу над методами МО для нейронных сетей. С тех пор технологии существенно эволюционировали и получили широкое распространение.<br />
</span></p>
<p style="text-align: justify;"><span>Нейронные сети являются ключевым элементом систем машинного обучения. Они состоят из множества взаимосвязанных нейронов, организованных в слои. Каждый нейрон получает входные данные, обрабатывает их с помощью весовых коэффициентов и передает результат на выход.<br />
</span></p>
<p style="text-align: justify;"><span>Для разработки и обучения нейронных сетей широко используется библиотека TensorFlow, предоставляемая Google. Она обеспечивает высокую производительность и гибкость при создании сложных моделей МО. TensorFlow поддерживает работу как на CPU, так и на GPU, что позволяет значительно ускорить процесс обучения нейронных сетей.<br />
</span></p>
<p style="text-align: justify;"><span>Google Colab предоставляет удобную среду для разработки и обучения моделей машинного обучения. Это облачный сервис, который позволяет использовать мощные вычислительные ресурсы Google без необходимости установки дополнительного программного обеспечения. Colab поддерживает работу с Jupyter Notebook и позволяет совместно работать над проектами в реальном времени​.<br />
</span></p>
<p style="text-align: justify;"><span>Первым шагом в создании системы распознавания является сбор и подготовка данных. Для обучения нейронной сети необходим большой объем данных, содержащий изображения согласных букв. Эти данные проходят этапы предобработки, включая нормализацию и аугментацию, что улучшает качество модели и её способность к обобщению.<br />
</span></p>
<p style="text-align: justify;"><span><span>Формат данных выборки для обучения </span><span>train.csv</span><span> выглядит следующим образом: каждая строка представляет собой описание одного изображения; первый столбец содержит метки классов, к которым принадлежит изображение; оставшиеся столбцы содержат пиксельные значения изображения, например, в виде плоского вектора, где каждое значение соответствует яркости соответствующего пикселя на изображении [1].<br />
</span></span></p>
<p style="text-align: justify;"><span>У нас будут следующие классы согласных букв:<br />
</span></p>
<p style="text-align: justify;"><span>classes = ["к","л","м","н","п","р","с","т"]<br />
</span></p>
<p style="text-align: justify;"><span>Загрузим и посмотрим на датасет (рисунок 1):<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1517_1.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 1. Датасет согласных букв<br />
</span></p>
<p style="text-align: justify;"><span>После подготовки данных, создаются и обучаются модели нейронных сетей. Используются различные архитектуры, такие как сверточные нейронные сети (CNN), которые особенно эффективны в задачах распознавания образов. Обучение модели проводится на обучающем наборе данных с последующей проверкой на валидационном наборе для оценки её производительности.<br />
</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><span>На первом шаге рассматривается сеть из двух нейронных слоев [2]. Для создания модели используется класс </span><span>Sequential</span><span>. На входном слое находятся 700 нейронов. Функция активации (запуска) </span><span>relu</span><span>, размер входных данных равен 400 (у нас картинки 20 на 20). На последнем слое должно быть 8 нейронов, так как это количество должно совпадать с количеством классификаций изображений [3] (у нас согласные буквы &#8220;к&#8221;,&#8221;л&#8221;,&#8221;м&#8221;,&#8221;н&#8221;,&#8221;п&#8221;,&#8221;р&#8221;,&#8221;с&#8221;,&#8221;т&#8221;). Модель нейронной сети строится с помощью класса </span><span>Sequential</span><span> [4].<br />
</span></span></p>
<p style="text-align: justify;"><span>N = 8<br />
</span></p>
<p style="text-align: justify;"><span>model = Sequential()<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Dense(700, input_dim=400, activation=&#8221;relu&#8221;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Dense( N, activation=&#8221;softmax&#8221;))<br />
</span></p>
<p>Приступаем к обучению модели с помощью метода <span>fit </span>модели (рисунок 2).</p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1517_2.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 2. Ход обучения нейронной сети<br />
</span></p>
<p style="text-align: justify;"><span>Можно посмотреть, как нейронная сеть делает предсказание на тестовых данных. Для этого применяется метод predict:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1517_3.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 3. Валидация нейронной сети<br />
</span></p>
<p style="text-align: justify;"><span>2. Трехслойная нейронная сеть.<br />
</span></p>
<p style="text-align: justify;"><span><span>Усложним нейронную сеть, сделав 3 слоя. Рассматривается сеть из трех нейронных слоев:</span><span><br />
</span></span></p>
<p style="text-align: justify;"><span>model = Sequential()<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Dense(700, input_dim=400, activation=&#8221;relu&#8221;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Dense(100, activation=&#8221;relu&#8221;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Dense( N, activation=&#8221;softmax&#8221;))<br />
</span></p>
<p style="text-align: justify;"><span>Остальные шаги проделываются аналогично.<br />
</span></p>
<p style="text-align: justify;"><span>3. Сверточная нейронная сеть.<br />
</span></p>
<p style="text-align: justify;"><span>Полносвязная нейронная сеть недостаточно качественно выполняет работу с изображениями. Прогресс обучения двуслойной нейронной сети и трехслойной нейронной сети растет достаточно медленно, за счет увеличения количества слоев. Более качественный результат можно получить, построив сверточную нейронную сеть:<br />
</span></p>
<p style="text-align: justify;"><span>model = Sequential()<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Conv2D(32, (3, 3),<br />
</span></p>
<p style="text-align: justify; margin-left: 35pt;"><span>input_shape=(img_width, img_height, 1), activation=&#8217;relu&#8217;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(MaxPooling2D(pool_size=(2,2)))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Conv2D(64, (3, 3), activation=&#8217;relu&#8217;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(MaxPooling2D(pool_size=(2, 2)))<br />
</span></p>
<p style="text-align: justify;"><span>model.add(Flatten())<br />
</span></p>
<p style="text-align: justify;"><span>model.add( Dense( 700, activation = &#8216;relu&#8217;))<br />
</span></p>
<p style="text-align: justify;"><span>model.add( Dense( N, activation=&#8217;softmax&#8217;))<br />
</span></p>
<p style="text-align: justify;"><span>Обучение проводится аналогично. По итогам распознавания собственных изображений можно сделать следующий вывод (таблица 1):<br />
</span></p>
<p><span style="color: black;">Таблица 1 – Качество распознавания изображений нейронными сетями<br />
</span></p>
<div style="margin-left: 5pt;">
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 262px;" />
<col style="width: 329px;" /></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 1pt;">
<p style="text-align: center;"><span>Структура НС</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;" valign="middle">
<p style="text-align: center;"><span style="color: black;">Качество распознавания</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: justify;"><span style="times new roman; 10pt; background-color: white;">Полносвязная нейронная сеть из двух слоев </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;" valign="middle">
<p style="text-align: center;"><span style="times new roman; 10pt; background-color: white;">97.75 %</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: justify;"><span style="times new roman; 10pt; background-color: white;">Полносвязная нейронная сеть из трех слоев </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;" valign="middle">
<p style="text-align: center;"><span style="times new roman; 10pt; background-color: white;">98.25 %</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: justify;"><span style="times new roman; 10pt; background-color: white;">Сверточная нейронная сеть с двумя сверточными слоями</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;" valign="middle">
<p style="text-align: center;"><span style="times new roman; 10pt; background-color: white;">99.65 %</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: justify;"><span>Подготовим также в Paint собственные изображения и загрузим их на гугл-диск (рисунок 4).<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1517_4.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span style="color: black;">Рисунок 4. Собственные изображения для проверки<br />
</span></p>
<p style="text-align: center;"><span style="color: black;">работы нейронной сети<br />
</span></p>
<p style="text-align: justify;"><span>Обученная нейронная сеть используется для распознавания согласных букв на новых данных. Модель анализирует входное изображение и выдает прогнозируемую букву с определенной вероятностью. Точность распознавания оценивается на тестовом наборе данных, который не использовался в процессе обучения, что позволяет объективно оценить её эффективность.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/06/061124_1517_5.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 5. Распознавание и предсказание нейронной сети<br />
</span></p>
<p style="text-align: justify;"><span>Сверточная нейронная сеть будет, как и ожидалось, давать наилучшее предсказание.<br />
</span></p>
<p style="text-align: justify;"><span>Заключение. Разработка и использование нейронных сетей для распознавания согласных букв демонстрирует высокую эффективность и перспективность данного подхода. Применение библиотек TensorFlow и сервисов, таких как Google Colab, значительно упрощает процесс создания и обучения моделей машинного обучения. Эти технологии открывают новые возможности для автоматизации процессов и повышения точности распознавания в различных приложениях.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2024/06/102167/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Криптографические механизмы электронной подписи: RSA на практике и преобразование данных в Maple</title>
		<link>https://web.snauka.ru/issues/2025/12/103994</link>
		<comments>https://web.snauka.ru/issues/2025/12/103994#comments</comments>
		<pubDate>Tue, 16 Dec 2025 05:38:06 +0000</pubDate>
		<dc:creator>author20348</dc:creator>
				<category><![CDATA[01.00.00 ФИЗИКО-МАТЕМАТИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[Maple]]></category>
		<category><![CDATA[RSA]]></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/2025/12/103994</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение В современных системах защиты информации электронная подпись является важнейшим инструментом обеспечения подлинности данных и подтверждения авторства цифрового документа. В основе большинства практических реализаций ЭП лежат асимметричные алгоритмы, среди которых RSA остается наиболее распространенным. Для корректного моделирования работы RSA в среде Maple необходимо [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em>к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</p>
<p><span><strong>Введение<br />
</strong></span></p>
<p><span>В современных системах защиты информации электронная подпись является важнейшим инструментом обеспечения подлинности данных и подтверждения авторства цифрового документа. В основе большинства практических реализаций ЭП лежат асимметричные алгоритмы, среди которых RSA остается наиболее распространенным.<br />
</span></p>
<p><span>Для корректного моделирования работы RSA в среде Maple необходимо переводить текстовые данные в числовую форму, поскольку криптографические вычисления осуществляются над числами. На этом этапе используются процедуры преобразования строк и набор функций Maple.<br />
</span></p>
<p><span><strong>1. Преобразование текста в числовой формат: функции Maple и их назначение<br />
</strong></span></p>
<p><span>Поскольку криптографический алгоритм работает с целыми числами, текст необходимо предварительно перевести в кодированную последовательность. В Maple это реализуется с помощью специально написанных процедур str_to_num и num_to_str.<br />
</span></p>
<p><span>• proc – конструкция для объявления пользовательской процедуры;<br />
</span></p>
<p><span>• Ord – преобразует символ в его числовой ASCII-код;<br />
</span></p>
<p><span>• Char – выполняет обратное преобразование к символу;<br />
</span></p>
<p><span>• length – определяет количество символов в строке;<br />
</span></p>
<p><span>• parse – превращает строку цифр в целое число;<br />
</span></p>
<p><span>• convert – выполняет преобразование типов данных (в данной лабораторной работе используется косвенно).<br />
</span></p>
<p><span>Процедура str_to_num последовательно получает числовое значение каждого символа строки, добавляет смещение и объединяет результаты в крупное число. Процедура num_to_str, напротив, выполняет обратное преобразование, разделяя число на трехзначные порции и возвращая исходную строку.<br />
</span></p>
<p><span><strong>2. Генерация ключей RSA: математические основы и функции Maple<br />
</strong></span></p>
<p><span>Процесс создания электронной подписи начинается с формирования ключевой пары: закрытого и открытого ключа RSA. Для выполнения этих операций используются функции Maple, применяемые в теории чисел:<br />
</span></p>
<p><span>• nextprime – позволяет находить следующие простые числа, необходимые для генерации модуля RSA;<br />
</span></p>
<p><span>• igcdex – вычисляет расширенный алгоритм Евклида и помогает найти мультипликативно обратный элемент;<br />
</span></p>
<p><span>• igcd – определяет наибольший общий делитель чисел.<br />
</span></p>
<p><span>Через определение igcd естественным образом вводится понятие взаимно простых чисел, что соответствует шестому контрольному вопросу: два числа считаются взаимно простыми, если их НОД равен 1, например, 8 и 15. Операции возведения в степень по модулю выполняются через функцию power, которая используется при шифровании хэша и при проверке подписи.<br />
</span></p>
<p><span><strong>3. Теоретический фундамент RSA: функция Эйлера и классические теоремы<br />
</strong></span></p>
<p><span>Для корректной работы RSA критически важной является функция Эйлера φ(n), определяемая как количество натуральных чисел, меньших n и не имеющих с ним общих делителей. Если n является произведением двух простых чисел p и q, то:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_1.png" alt="" /><span><br />
</span></p>
<p><span>Далее последовательно вводятся теорема Эйлера и малая теорема Ферма.<br />
</span></p>
<p><span>• Теорема Эйлера утверждает: для любого числа a, взаимно простого с n, выполняется<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_2.png" alt="" /><span><br />
</span></p>
<p><span>• Малая теорема Ферма является частным случаем для простого модуля и гласит:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_3.png" alt="" /><span><br />
</span></p>
<p><span><strong>4. Вычисление хэша сообщения<br />
</strong></span></p>
<p><span>Для формирования электронной подписи необходимо получить компактное числовое представление текста – его хэш. В рамках лабораторной работы допускается упрощенная схема хэширования, например вычисление остатка от деления большого числа, полученного через str_to_num.<br />
</span></p>
<p><span>В качестве данных используется текстовый фрагмент выбранного автора, причем для корректности моделирования рекомендуется удалить переносы строк и абзацы.<br />
</span></p>
<p><span><strong>5. Формирование электронной подписи и проверка ее подлинности<br />
</strong></span></p>
<p><span>Электронная подпись создается путем возведения хэша сообщения в степень закрытого ключа d по модулю n:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_4.png" alt="" /><span><br />
</span></p>
<p><span>Здесь раскрывается суть электронной подписи: это механизм, позволяющий подтвердить неизменность данных и удостоверить отправителя посредством использования закрытого ключа. Проверка подписи выполняется аналогичным способом с использованием открытого ключа:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_5.png" alt="" /><span><br />
</span></p>
<p><span>Если вычисленный хэш совпадает с хэшом полученного сообщения, подпись считается корректной.<br />
</span></p>
<p><span>ЭП применяется в электронном документообороте, государственном обмене данными, онлайн-банкинге, цифровых сертификатах, защите программного обеспечения и других сферах, где требуется юридическая значимость электронных документов.<br />
</span></p>
<p><span><strong>6.</strong><br />
<strong>Практический пример реализации RSA<br />
</strong></span></p>
<p><span>Для демонстрации работоспособности алгоритма RSA в рамках лабораторного задания была разработана программная реализация в системе Maple, выполняющая полный цикл преобразования данных: от перевода текста в числовой формат до операций шифрования и расшифрования. В качестве примера взято имя «Тимур», которое в процессе работы алгоритма последовательно преобразуется в число, шифруется с использованием открытого ключа и восстанавливается с помощью закрытого.<br />
</span></p>
<p><span>Поскольку криптографические операции в RSA осуществляются над целыми числами, первый этап заключается в переводе текста в числовую последовательность. Для этого используется процедура, аналогичная описанной ранее str_to_num, которая формирует для каждого символа двухзначный ASCII-код и объединяет их в одно большое число. В результате имя «Тимур» принимает вид числа <em>M </em>= 113140109117114.<br />
</span></p>
<p><span>Далее выполняется генерация ключевой пары. С помощью функции nextprime выбираются два простых числа, например <em>p</em>=101 и <em>q</em>=211. Их произведение дает модуль <em>n </em>= 21311, после чего вычисляется значение функции Эйлера <em>φ</em>(<em>n</em>) = (<em>p</em>−1)(<em>q</em>−1) = 21000. Открытая экспонента <em>e</em> выбирается как число, взаимно простое с φ(n)<em>φ</em>(<em>n</em>); в данном случае <em>e </em>= 17. Закрытая экспонента <em>d</em> определяется как обратный элемент к <em>e</em> по модулю φ(n)<em>φ</em>(<em>n</em>) с использованием расширенного алгоритма Евклида, реализуемого функцией igcdex. В результате вычислений получается <em>d</em>=12353. Таким образом, открытый ключ составляет пару (<em>e</em>, <em>n</em>) = (17, 21311), а закрытый — (<em>d</em>, <em>n</em>) = (12353, 21311).<br />
</span></p>
<p><span>Процесс шифрования сводится к возведению числового представления текста <em>M</em> в степень открытого ключа <em>e</em> по модулю <em>n</em>:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_6.png" alt="" /><span><br />
</span></p>
<p><span>Полученный шифротекст <em>C </em>= 9876 передается для расшифрования, которое выполняется аналогичной операцией, но с использованием закрытой экспоненты <em>d</em>:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_7.png" alt="" /><span><br />
</span></p>
<p><span>Результат <em>M</em>′ в точности совпадает с исходным числовым представлением <em>M</em>. Финальное преобразование числа обратно в текст с помощью процедуры, обратной str_to_num, восстанавливает исходное имя «Тимур», что подтверждает корректность работы алгоритма.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/121625_0523_8.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Листинг 1 &#8211; Программная реализация RSA-шифрования в Maple<br />
</span></p>
<p><span>Представленная реализация наглядно демонстрирует не только теоретическую основу RSA, но и его практическую применимость для защиты информации. Использование встроенных функций Maple, таких как nextprime, igcdex и модульная арифметика, позволяет точно смоделировать все этапы криптографического преобразования, что подтверждает надежность и согласованность алгоритма в условиях учебного моделирования.<br />
</span></p>
<p><span><strong>Заключение<br />
</strong></span></p>
<p><span>Криптографические механизмы электронной подписи, основанные на алгоритме RSA, остаются одним из наиболее устойчивых и практичных инструментов обеспечения доверия в цифровых коммуникациях. Их надежность определяется как стойкостью математической основы, так и корректностью реализации вспомогательных процедур, включая преобразование данных, вычисление хэш-функций и генерацию ключевой пары.<br />
</span></p>
<p><span>Анализ теоретических принципов RSA – свойств функции Эйлера, взаимной простоты чисел и фундаментальных теорем теории чисел – показывает, что математическая строгая структура алгоритма напрямую связана с его устойчивостью к криптоаналитическим атакам. Практическая реализация подписи требует тщательного соблюдения всех этапов вычислений, поскольку любой из них критически влияет на итоговую безопасность.<br />
</span></p>
<p><span>Применение специализированных инструментов, таких как Maple, демонстрирует, что современные средства компьютерной алгебры способны эффективно поддерживать исследовательскую и учебную деятельность в области криптографии, предоставляя возможности для моделирования алгоритмов и анализа их свойств.<br />
</span></p>
<p><span>В совокупности рассмотренные методы подтверждают, что RSA-подпись остается универсальным, проверенным и теоретически обоснованным решением для задач аутентификации и контроля целостности данных в условиях постоянно возрастающих требований к цифровой безопасности.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/12/103994/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разработка Android‑приложения для отображения погоды с использованием Gismeteo и Jsoup</title>
		<link>https://web.snauka.ru/issues/2026/03/104431</link>
		<comments>https://web.snauka.ru/issues/2026/03/104431#comments</comments>
		<pubDate>Tue, 31 Mar 2026 13:31:53 +0000</pubDate>
		<dc:creator>author20348</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[ExecutorService]]></category>
		<category><![CDATA[Gismeteo]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[Jsoup]]></category>
		<category><![CDATA[мобильная разработка]]></category>
		<category><![CDATA[парсинг погоды]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/03/104431</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Веб-скрейпинг с использованием библиотеки Jsoup остается высокоактуальной темой для Android-разработчиков, поскольку позволяет автоматизировать сбор данных с веб-сайтов, включая прогнозы погоды, новости и коммерческую информацию. В условиях отсутствия открытых API у многих популярных ресурсов, включая Gismeteo, эта техника становится востребованной в мобильной разработке, аналитике [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович</em><br />
<em>к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p>Веб-скрейпинг с использованием библиотеки Jsoup остается высокоактуальной темой для Android-разработчиков, поскольку позволяет автоматизировать сбор данных с веб-сайтов, включая прогнозы погоды, новости и коммерческую информацию. В условиях отсутствия открытых API у многих популярных ресурсов, включая Gismeteo, эта техника становится востребованной в мобильной разработке, аналитике и автоматизации задач, где прямой доступ к данным невозможен.</p>
<p>В данной работе выполняется парсинг погоды для Ростова-на-Дону с сайта Gismeteo (рисунок 1) с использованием библиотеки Jsoup для извлечения температуры из HTML-структуры страницы. Для обеспечения корректной работы сетевых запросов применяется ExecutorService, организующий фоновый поток, а обновление пользовательского интерфейса выполняется через Handler. Подобные скрипты востребованы при создании мобильных информеров, особенно для регионов, данные по которым недоступны через официальные API. Стабильность библиотеки Jsoup и встроенных средств многопоточности Android обеспечивает надежность работы приложения в условиях ограниченных ресурсов мобильного устройства.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-104436" title="ris1" src="https://web.snauka.ru/wp-content/uploads/2026/03/ris12.png" alt="" width="516" height="234" /></p>
<p align="center">Рисунок 1. Сайт погоды</p>
<p align="left">Алгоритм решения задачи по созданию Android-приложения для отображения погоды включает следующие последовательные шаги разработки:</p>
<ul>
<li>добавляем разрешение на доступ к интернету в файл AndroidManifest.xml;</li>
<li>подключаем зависимость библиотеки Jsoup в файле build.gradle модуля приложения;</li>
<li>создаём интерфейс с кнопкой для запуска парсинга и текстовым полем для отображения результата;</li>
<li>инициализируем ExecutorService для выполнения сетевого запроса в фоновом потоке;</li>
<li>выполняем подключение к сайту Gismeteo с указанием URL нужного города;</li>
<li>находим элемент с классом &#8220;weather-value&#8221; и извлекаем из него значение температуры;</li>
<li>обрабатываем возможные исключения при сетевом подключении;</li>
<li>используем Handler для обновления TextView с полученными данными в UI-потоке.</li>
</ul>
<p align="left">Ниже приведен фрагмент кода основной логики приложения:</p>
<p style="background: white;"><span><span style="color: #0033b3;">private </span>View<span style="color: #080808;">.</span>OnClickListener <span style="color: #871094;">myOnClick <span style="color: #080808;">= <span style="color: #0033b3;">new </span>View.</span>OnClickListener<span style="color: #080808;">() {</span></span></span></p>
<p style="background: white; padding-left: 30px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;">public void <span style="color: #00627a;">onClick<span style="color: #080808;">(</span>View v<span style="color: #080808;">) {</span></span></span></span></span></span></p>
<p style="background: white; padding-left: 60px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;">ExecutorService executor <span style="color: #080808;">= </span>Executors<span style="color: #080808;">.<em>newSingleThreadExecutor</em>();</span></span></span></span></span></span></p>
<p style="background: white; padding-left: 60px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;">Handler handler <span style="color: #080808;">= <span style="color: #0033b3;">new <span style="color: #080808;">Handler(</span>Looper<span style="color: #080808;">.<em>getMainLooper</em>());</span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 60px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;">executor<span style="color: #080808;">.execute(<span style="color: #0033b3;">new </span>Runnable() {</span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 90px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;">String <span style="color: #871094;">title<span style="color: #080808;">;</span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 90px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;">@Override</span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 90px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;">public void <span style="color: #00627a;">run<span style="color: #080808;">() {</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 120px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><em>//Background work here</em></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 120px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;">try <span style="color: #080808;">{</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;">Document doc <span style="color: #080808;">= </span>Jsoup<span style="color: #080808;">.<em>connect</em>(<span style="color: #067d17;">&#8220;https://www.gismeteo.ru/weather-rostov-na-donu-5110/&#8221;<span style="color: #080808;">).get();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;">Elements ele <span style="color: #080808;">= </span>doc<span style="color: #080808;">.select(<span style="color: #067d17;">&#8220;div[class=weather-value]&#8220;<span style="color: #080808;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;">Element pogoda <span style="color: #080808;">= </span>ele<span style="color: #080808;">.select(<span style="color: #067d17;">&#8220;temperature-value&#8221;<span style="color: #080808;">).first();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;">title <span style="color: #080808;">= </span>pogoda<span style="color: #080808;">.val();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 120px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">} <span style="color: #0033b3;">catch <span style="color: #080808;">(</span>IOException e<span style="color: #080808;">) {</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><em>// e.printStackTrace();</em></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;">title <span style="color: #080808;">= <span style="color: #067d17;">&#8220;error&#8221;<span style="color: #080808;">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 120px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 120px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #851691;">handler<span style="color: #080808;">.post(<span style="color: #0033b3;">new </span>Runnable() {</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #851691;"><span style="color: #080808;"><span style="color: #9e880d;">@Override</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 150px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #851691;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;">public void <span style="color: #00627a;">run<span style="color: #080808;">() {</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="background: white; padding-left: 180px;"><span><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #0033b3;"><span style="color: #080808;"><span style="color: #8c8c8c;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #851691;"><span style="color: #080808;"><span style="color: #9e880d;"><span style="color: #0033b3;"><span style="color: #00627a;"><span style="color: #080808;"><span style="color: #8c8c8c;"><em>//UI Thread work here</em></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 180px;"><span style="color: #871094;">myTextView<span style="color: #080808;">.setText(<span style="color: #067d17;">&#8220;Ростов-на-Дону: &#8221; <span style="color: #080808;">+ <span style="color: #871094;">title<span style="color: #080808;">);</span></span></span></span></span></span></p>
<p style="padding-left: 150px;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">}</span></span></span></span></span></span></p>
<p style="padding-left: 120px;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">});</span></span></span></span></span></span></p>
<p style="padding-left: 90px;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">}</span></span></span></span></span></span></p>
<p style="padding-left: 60px;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">});</span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">}</span></span></span></span></span></span></p>
<p><span style="color: #871094;"><span style="color: #080808;"><span style="color: #067d17;"><span style="color: #080808;"><span style="color: #871094;"><span style="color: #080808;">};<br />
</span></span></span></span></span></span></p>
<p style="background: white;"><span style="color: #080808;"><br />
</span></p>
<p>В представленном коде при нажатии на кнопку создается однопоточный ExecutorService, который выполняет сетевой запрос в фоне. Jsoup подключается к странице города, находит элемент с классом &#8220;weather-value&#8221; и извлекает из вложенного тега &#8220;temperature-value&#8221; значение температуры. В случае ошибки (отсутствие интернета, изменение структуры сайта) в переменную title записывается &#8220;error&#8221;. После завершения работы Handler обновляет TextView в главном потоке.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-104437" title="ris2" src="https://web.snauka.ru/wp-content/uploads/2026/03/ris2.png" alt="" width="372" height="173" /></p>
<p align="center">Рисунок 2. Интерфейс разработанного приложения с результатом парсинга</p>
<p style="text-align: left;" align="center"><strong>Заключение</strong><strong> </strong></p>
<p align="left">Разработанное Android-приложение успешно выполняет парсинг данных о погоде с сайта Gismeteo и отображает температуру для указанного города. Использование библиотеки Jsoup в сочетании с ExecutorService и Handler обеспечивает стабильную работу приложения без блокировки пользовательского интерфейса. Предложенный подход может быть адаптирован для парсинга любых данных с веб-страниц, что расширяет возможности мобильных приложений при отсутствии официальных API. Важно помнить об этических аспектах и соблюдении правил robots.txt при разработке подобных решений. Дальнейшее развитие приложения может включать добавление списка городов, автоматическое обновление данных и визуализацию погодных условий.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/03/104431/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Моделирование стереометрических фигур в браузере с помощью WebGL</title>
		<link>https://web.snauka.ru/issues/2026/04/104432</link>
		<comments>https://web.snauka.ru/issues/2026/04/104432#comments</comments>
		<pubDate>Wed, 01 Apr 2026 14:58:21 +0000</pubDate>
		<dc:creator>author20348</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>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/04/104432</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Когда перед разработчиком встает задача отобразить трехмерные объекты в браузере, первое, что приходит на ум — использовать WebGL. Однако писать на чистом WebGL — занятие не для слабонервных. Слишком много деталей приходится контролировать вручную: буферы вершин, шейдеры, матрицы преобразований. Именно поэтому практически любой [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p style="text-align: center;" align="right">
<p align="left">Когда перед разработчиком встает задача отобразить трехмерные объекты в браузере, первое, что приходит на ум — использовать WebGL. Однако писать на чистом WebGL — занятие не для слабонервных. Слишком много деталей приходится контролировать вручную: буферы вершин, шейдеры, матрицы преобразований. Именно поэтому практически любой проект в этой области начинается с подключения библиотеки Three.js. Она берет на себя всю низкоуровневую работу и позволяет сосредоточиться на самом главном — на том, что именно мы хотим показать пользователю.</p>
<p align="left">Задача, которая была поставлена, звучала просто: создать веб-страницу, на которой размещены девять различных стереометрических фигур, включая классический чайник Юты. Все фигуры должны располагаться на общей плоскости, иметь различимые цвета и возможность интерактивного осмотра. Никакой анимации или сложных эффектов не требовалось — только чистая геометрия и удобство восприятия.</p>
<p align="left">Первым делом подготавливается базовая HTML-структура. Здесь важно правильно организовать импорт модулей. Three.js использует модульную систему, поэтому на странице объявляется import map, который указывает, откуда загружать библиотеку и ее дополнения. Сам код пишется внутри тега script type=&#8221;module&#8221;, что позволяет использовать синтаксис импорта и экспорта прямо в браузере.</p>
<p align="left">&lt;!DOCTYPE html&gt;</p>
<p align="left">&lt;html lang=&#8221;ru&#8221;&gt;</p>
<p align="left">&lt;head&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;meta charset=&#8221;UTF-8&#8243;&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;title&gt;9 фигур + чайник на плоскости&lt;/title&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;style&gt;</p>
<p style="padding-left: 30px;" align="left">        body { margin: 0; overflow: hidden; background-color: #111; }</p>
<p style="padding-left: 30px;" align="left">    &lt;/style&gt;</p>
<p align="left">&lt;/head&gt;</p>
<p align="left">&lt;body&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;script type=&#8221;importmap&#8221;&gt;</p>
<p style="padding-left: 60px;" align="left">        {</p>
<p style="padding-left: 90px;" align="left">            &#8220;imports&#8221;: {</p>
<p style="padding-left: 120px;" align="left">                &#8220;three&#8221;: &#8220;https://unpkg.com/three@0.128.0/build/three.module.js&#8221;,</p>
<p style="padding-left: 120px;" align="left">                &#8220;three/addons/&#8221;: &#8220;https://unpkg.com/three@0.128.0/examples/jsm/&#8221;</p>
<p style="padding-left: 90px;" align="left">            }</p>
<p style="padding-left: 60px;" align="left">        }</p>
<p style="padding-left: 30px;" align="left">    &lt;/script&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;script type=&#8221;module&#8221;&gt;</p>
<p style="padding-left: 60px;" align="left">        // весь код приложения</p>
<p style="padding-left: 30px;" align="left">    &lt;/script&gt;</p>
<p align="left">&lt;/body&gt;</p>
<p align="left">&lt;/html&gt;</p>
<p align="center">Листинг 1 &#8211; Базовая структура HTML-документа и импорт зависимостей</p>
<p align="center">
<p align="left">Создание любой 3D-сцены в Three.js начинается с трех обязательных компонентов: сцены, камеры и рендерера. Сцена — это контейнер, в который помещаются все объекты, источники света и вспомогательные элементы. Камера определяет точку обзора — в данном случае выбрана перспективная камера с углом обзора 45 градусов, что приближает восприятие к тому, как человеческий глаз видит реальные объекты. Рендерер отвечает за отрисовку: он создает canvas-элемент и выводит на него изображение. Чтобы сцена не выглядела плоской, добавляется освещение. Два направленных источника света располагаются под разными углами, создавая четкие светотеневые переходы, а мягкий фоновый свет предотвращает появление слишком темных участков.</p>
<p align="left">
<p align="left">import * as THREE from &#8216;three&#8217;;</p>
<p align="left">import { OrbitControls } from &#8216;three/addons/controls/OrbitControls.js&#8217;;</p>
<p align="left">import { TeapotGeometry } from &#8216;three/addons/geometries/TeapotGeometry.js&#8217;;</p>
<p align="left">
<p align="left">const scene = new THREE.Scene();</p>
<p align="left">scene.background = new THREE.Color(0xeeeeee);</p>
<p align="left">
<p align="left">const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);</p>
<p align="left">camera.position.set(6, 4, 9);</p>
<p align="left">camera.lookAt(0, 1, 0);</p>
<p align="left">
<p align="left">const renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p align="left">renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p align="left">renderer.shadowMap.enabled = false;</p>
<p align="left">document.body.appendChild(renderer.domElement);</p>
<p align="left">
<p align="left">const dirLight1 = new THREE.DirectionalLight(0xffffff, 1.0);</p>
<p align="left">dirLight1.position.set(2, 5, 3);</p>
<p align="left">scene.add(dirLight1);</p>
<p align="left">
<p align="left">const dirLight2 = new THREE.DirectionalLight(0xffffff, 0.7);</p>
<p align="left">dirLight2.position.set(-3, 4, 4);</p>
<p align="left">scene.add(dirLight2);</p>
<p align="left">
<p align="left">const ambientLight = new THREE.AmbientLight(0&#215;404060);</p>
<p align="left">scene.add(ambientLight);</p>
<p align="center">Листинг 2 &#8211; Инициализация сцены, камеры, рендерера и освещения</p>
<p align="left">
<p align="left">Теперь, когда сцена готова к работе, необходимо создать опорную плоскость, на которой будут стоять фигуры. Для этого используется PlaneGeometry — плоский прямоугольник, который разворачивается горизонтально. Поверх него накладывается GridHelper — сетка, помогающая визуально оценить расположение объектов в пространстве. Эти два элемента создают необходимый контекст: фигуры не висят в пустоте, а имеют четкую привязку к поверхности.</p>
<p align="left">Для удобства добавления фигур написана небольшая функция-обертка addFigure. Она принимает геометрию, цвет и координаты положения, создает материал с заданными свойствами и помещает объект на сцену. Такой подход избавляет от повторяющегося кода и делает добавление новых фигур простым и наглядным.</p>
<p align="left">
<p align="left">const planeGeometry = new THREE.PlaneGeometry(14, 14);</p>
<p align="left">const planeMaterial = new THREE.MeshStandardMaterial({ color: 0xcccccc, side: THREE.DoubleSide });</p>
<p align="left">const plane = new THREE.Mesh(planeGeometry, planeMaterial);</p>
<p align="left">plane.rotation.x = Math.PI / 2;</p>
<p align="left">plane.position.y = 0;</p>
<p align="left">scene.add(plane);</p>
<p align="left">
<p align="left">const gridHelper = new THREE.GridHelper(14, 20, 0&#215;666666, 0&#215;333333);</p>
<p align="left">gridHelper.position.y = 0.01;</p>
<p align="left">scene.add(gridHelper);</p>
<p align="left">
<p align="left">function addFigure(geometry, color, position) {</p>
<p style="padding-left: 30px;" align="left">    const material = new THREE.MeshStandardMaterial({ color: color, roughness: 0.5, metalness: 0.0 });</p>
<p style="padding-left: 30px;" align="left">    const mesh = new THREE.Mesh(geometry, material);</p>
<p style="padding-left: 30px;" align="left">    mesh.position.set(position[0], position[1], position[2]);</p>
<p style="padding-left: 30px;" align="left">    scene.add(mesh);</p>
<p align="left">}</p>
<p align="left">
<p align="left">addFigure(new THREE.BoxGeometry(1, 1, 1), 0x3366ff, [-3.5, 0.5, -3.0]);</p>
<p align="left">addFigure(new THREE.ConeGeometry(0.7, 1.4, 4), 0xff9933, [-1.0, 0.7, -3.0]);</p>
<p align="left">addFigure(new THREE.SphereGeometry(0.8, 32, 16), 0xaa66ff, [2, 0.8, -3.0]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.7, 0.7, 1.4, 32), 0xf5deb3, [-2.6, 0.7, -0.5]);</p>
<p align="left">addFigure(new THREE.ConeGeometry(0.8, 1.5, 32), 0x33cc33, [0.9, 0.75, -0.5]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.7, 0.7, 1.2, 3), 0x99ff99, [-3.5, 0.6, 1.5]);</p>
<p align="left">addFigure(new THREE.BoxGeometry(1.2, 0.8, 0.8), 0xff4444, [-1, 0.4, 1.8]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.8, 0.8, 1.2, 6), 0xffdd44, [2, 0.6, 1.5]);</p>
<p align="left">
<p align="left">const teapotGeo = new TeapotGeometry(0.9, 12, true, true, true, true);</p>
<p align="left">const teapotMat = new THREE.MeshStandardMaterial({ color: 0&#215;222222, roughness: 0.3, metalness: 0.2 });</p>
<p align="left">const teapot = new THREE.Mesh(teapotGeo, teapotMat);</p>
<p align="left">teapot.position.set(-1.0, 1, 4);</p>
<p align="left">teapot.rotation.set(0, 0.2, 0);</p>
<p align="left">scene.add(teapot);</p>
<p align="left">
<p align="left">const controls = new OrbitControls(camera, renderer.domElement);</p>
<p align="left">controls.enableDamping = false;</p>
<p align="left">controls.autoRotate = false;</p>
<p align="left">controls.target.set(0, 0.8, 0);</p>
<p align="left">
<p align="left">function animate() {</p>
<p style="padding-left: 30px;" align="left">    requestAnimationFrame(animate);</p>
<p style="padding-left: 30px;" align="left">    controls.update();</p>
<p style="padding-left: 30px;" align="left">    renderer.render(scene, camera);</p>
<p align="left">}</p>
<p align="left">animate();</p>
<p align="left">
<p align="left">window.addEventListener(&#8216;resize&#8217;, () =&gt; {</p>
<p style="padding-left: 30px;" align="left">    camera.aspect = window.innerWidth / window.innerHeight;</p>
<p style="padding-left: 30px;" align="left">    camera.updateProjectionMatrix();</p>
<p style="padding-left: 30px;" align="left">    renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p align="left">});</p>
<p align="center">Листинг 3 &#8211; Создание опорной плоскости, сетки, геометрических фигур и чайника</p>
<p align="center">
<p align="left">Восемь основных фигур размещаются в два ряда, чтобы их можно было легко рассмотреть как по отдельности, так и в сравнении. Куб, сфера, цилиндр и конус — это стандартные геометрические примитивы, которые в Three.js создаются соответствующими классами. Интереснее обстоит дело с призмами. Треугольная и шестиугольная призмы реализованы с помощью цилиндра, у которого количество сегментов уменьшено до трех и шести соответственно. Этот прием работает благодаря тому, что цилиндр с малым числом сегментов превращается в многогранник, а сглаживание граней делает его визуально похожим на призму.</p>
<p align="left">Отдельного внимания заслуживает чайник. Это не просто случайная фигура, а объект с историей. Чайник Юты был создан в 1975 году Мартином Ньюэллом как тестовая модель для систем трехмерной графики. Его форма содержит криволинейные поверхности, отверстия и сложные изгибы, что делает его отличным индикатором качества рендеринга. В Three.js чайник доступен через TeapotGeometry из дополнений, и его подключение занимает всего несколько строк кода.</p>
<p align="left">Для управления камерой используется OrbitControls. Этот контроллер позволяет пользователю вращать сцену, приближать и отдалять изображение, а также перемещать точку обзора. Такая интерактивность критически важна при работе с трехмерными объектами: только возможность рассмотреть фигуру со всех сторон дает полное представление о ее форме.</p>
<p align="left">Каждая фигура получила свой цвет, что не только делает сцену более наглядной, но и помогает быстро идентифицировать объекты. Синий куб, оранжевая пирамида, фиолетовая сфера, бежевый цилиндр, зеленый конус, салатовая треугольная призма, красный параллелепипед, желтая шестиугольная призма и черный чайник — все они четко различимы даже при беглом взгляде на сцену.</p>
<p align="left">Производительность приложения остается высокой благодаря нескольким решениям. Отключение теней (shadowMap.enabled = false) существенно снижает нагрузку на видеокарту, а разумный выбор количества сегментов у сферы (32×16) дает хорошее качество без избыточной геометрической сложности. Конечно, для более реалистичной сцены тени были бы полезны, но в учебно-демонстрационных задачах они часто оказываются излишними.</p>
<p align="left">После завершения всех настроек остается запустить цикл анимации. В Three.js это делается через requestAnimationFrame, который обеспечивает плавное обновление кадра. Даже если в сцене нет движущихся объектов, этот цикл необходим для корректной работы контроллеров и обработки изменений размера окна.</p>
<p align="center"><img class="aligncenter size-full wp-image-104440" title="risunok1" src="https://web.snauka.ru/wp-content/uploads/2026/04/risunok1.png" alt="" width="426" height="249" /></p>
<p align="center">Рисунок 1. Финальный вид сцены с возможностью вращения камеры</p>
<p style="text-align: left;" align="center"><strong>Заключение</strong><strong> </strong></p>
<p align="left">В результате выполнения работы разработано веб-приложение для визуализации стереометрических фигур с использованием WebGL и библиотеки Three.js. Созданная 3D-сцена включает девять геометрических объектов, реализованных с помощью стандартных примитивов библиотеки. Обеспечена интерактивность за счет подключения контроллера камеры, позволяющего пользователю вращать и масштабировать сцену. Разработанное приложение может быть использовано в образовательных целях для изучения основ стереометрии и демонстрирует возможности современных веб-технологий в области трехмерного моделирования.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/04/104432/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
