#import "templates/index.typ": *
#import "templates/utils.typ": *
#import "libs/tablex.typ": *

// Тут указываем только авторов [authors] и название работы [title] 
#show: index.with(authors: ("<NAME>", ), title: [ОТЧЁТ О ПРАКТИКЕ])

// ch -- center heading
#ch("Введение")

Производственная практика проходила на предприятии ООО “ВАЛДАЙ РОБОТЫ”. Основной вид деятельности предприятия: «Производство промышленных роботов и робототехнических устройств»

Структура предприятия представлена на рисунке @org_structure.

#figure(
  image(ip("org_structure.png")),
  caption: "Структура организации"
) <org_structure>


Практика будет проходить в отделе разработки ПО, в подотделе разработки ПО высокого уровня.

Перед отделом стоят цели разработки автономной работы роботизированных устройств, а также разработки связанного с этим ПО, например, программ для операторов устройств.

Отдел не имеет фиксированных требований к конкретному программному обеспечению, что позволяет использовать наиболее подходящие инструменты для каждой задачи. В настоящий момент работа ведется с помощью следующих программ:

\1. Редактор исходного кода Visual Studio Code:

Описание: Популярный редактор с открытым исходным кодом, разработанный Microsoft.
Преимущества:

| Поддержка подсветки синтаксиса для различных языков программирования.

| Множество расширений, добавляющих дополнительные функции, такие как отладка, автодополнение кода и интеграция с системами контроля версий.

| Кроссплатформенность (доступен для Windows, macOS и Linux).
Использование: В отделе используется для написания кода на различных языках программирования, таких как C++, Python, JavaScript и Go.

\2. IDE Keil µVision:

Описание: Интегрированная среда разработки (IDE) для микроконтроллеров семейства ARM Cortex-M.
Преимущества:
| Встроенный компилятор, отладчик и симулятор.

| Поддержка различных отладочных инструментов, таких как J-Link и ULINK.

| Библиотека готовых к использованию программных модулей.

Использование: В отделе используется для разработки программного обеспечения для микроконтроллеров, используемых в различных проектах.

\3. Git:

Описание: Система контроля версий, позволяющая отслеживать изменения в файлах и коде.
Преимущества:

| Позволяет работать над проектами совместно с другими разработчиками.

| Помогает отслеживать историю изменений и откатывать к предыдущим версиям.

| Обеспечивает децентрализованное хранение кода.

Использование: В отделе используется для контроля версий исходного кода, документации и других файлов.
\4. Gitea:

Описание: Локальный Git-сервер, позволяющий хранить и управлять Git-репозиториями.
Преимущества:
| Позволяет работать с Git-репозиториями в локальной сети без доступа к интернету.

| Обеспечивает более высокий уровень безопасности и контроля над кодом.

| Прост в установке и использовании.

Использование: В отделе используется для хранения Git-репозиториев, доступ к которым требуется только сотрудникам отдела.

#pagebreak()

= Разработка технического задания

Разработанное техническое задание представлено в приложении А.

#pagebreak()
= Проектирование приложения

== Анализ предметной области
Назначение разрабатываемой системы состоит в создании альтернативного мультиплатформенного открытого приложения для воспроизведения музыки из сервиса Яндекс Музыка. Это приложение будет обеспечивать единые функциональные возможности в различных версиях. Основные проблемы, которые система должна решить, включают отсутствие возможности совместного прослушивания музыки различными пользователями, ограниченный набор настроек, закрытость системы. Решением этих проблем будет распространение исходного кода для дальнейшей модернизации системы, а также возможность инсталляции дополнительных модулей сторонних разработчиков.

Система будет обладать рядом функциональных возможностей, включая прослушивание музыки из библиотеки Яндекс Музыка, перемешивание треков, цикличное прослушивание, функцию "Моя волна" для бесконечного потока треков, а также возможность установки плагинов от сторонних разработчиков. Кроме того, пользователи смогут проводить совместное прослушивание треков и настраивать цветовую схему приложения.

Дизайн системы будет выполнен в стиле Material You с применением основных принципов и элементов этого дизайна. Подобные продукты на рынке включают Яндекс Музыка, Spotify и Apple Music, однако они не обладают всеми необходимыми функциями, предложенными разрабатываемой системой.

Система будет тиражируемой и доступной для пользователей во всех странах, где доступно приложение Яндекс Музыка. Предполагается обмен данными с API Яндекс Музыка. К моменту реализации она будет предоставлена на бесплатной основе для неограниченного числа пользователей. Приложение разработано для широкого круга пользователей и не требует дополнительного обучения для использования. Единственный необходимый канал связи - интернет, который также необходим для загрузки треков. Данные хранятся распределённо, частично в самом приложении, частично на серверах Яндекс Музыка. Учитываются привычки пользователей при использовании аналогичных приложений, чтобы облегчить переход на новую систему.

== Проектирование структуры приложения

Для разработки приложения будет использован фреймворк Kotlin Multiplatform, из-за чего код распределён на:

| common (общий) -- код, который будет работать на всех платформах;

| native -- код, который работает нативно на каждой платформе (android, jvm, windows, iOS, MacOS). @kmp


При этом в common части будет использована концепция Clean Architecture и паттерн MVVM, благодаря чему приложение было разделено на несколько слоев:

| data -- слой получения данных;

| ui -- слой пользовательского интерфейса;

| viewmodel -- смежный слой, между data и ui;

| model -- вспомогательные модели для интерфейса.

Итоговая структура приложения представлена на рисунке @structure.


#figure(
  image(ip("structure.png")),
  caption: "Структура мобильного приложения"
) <structure>

Для навигации будет использована библиотека Appyx, которая представляет навигацию в виде графов, для более простого её использования была создана диаграмма путей пользователя, представленная на рисунке @userflow.

#figure(
  image(ip("userflow.png")),
  caption: "Пути пользователя"
) <userflow>


== Проектирование базы данных

В ходе проектирования работы приложения, было принято решение разрабатывать приложение используя offline first подход.


Offline First - это подход к разработке программного обеспечения, при котором основное внимание уделяется обеспечению надежной работы приложения в условиях отсутствия интернет-соединения или при низкой его стабильности. Главная идея заключается в том, чтобы приложение могло выполнять основные функции даже в отсутствие активного сетевого соединения. @offlinefirst

Для сохранение данных в приложении была спроектирована база данных, полная схема которой представлена на рисунке @dbScheme. Логическая структура таблиц представлена на таблицах @firstTable\-@lastTable.

#figure(
  image(ip("dbScheme.png"), height: 70%),
  caption: "Схема базы данных"
) <dbScheme>

Таблица @firstTable содержит сведения об альбомах.

#figure(
  tablex(columns: 5, repeat-header: true,
  [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [PK],
  [id],
  [INTEGER],
  [Уникальный идентификатор альбома],
  [\>0, NOT NULL, AI],
  [],
  [title],
  [TEXT],
  [Название альбома],
  [],
  [],
  [trackCount],
  [INTEGER],
  [Количество треков в альбоме],
  [],
  [],
  [cover],
  [TEXT],
  [Ссылка на обложку альбома],
  [],
  ),
  caption: "Описание логической структуры таблицы ALBUM",
  supplement: "Таблица",
  kind: table
) <firstTable>

Таблица @albumArtist является вспомогательной таблицей для для связи многие ко многим исполнителя к альбомам.

#figure(
  tablex(columns: 5, repeat-header: true,
   [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [],
  [albumId],
  [INTEGER],
  [Идентификатор альбома],
  [NOT NULL, \ FK(ALBUM.id)],
  [],
  [artistId],
  [INTEGER],
  [Идентификатор исполнителя],
  [NOT NULL, \ FK(ARTIST.id)]
  ),
  caption: "Описание логической структуры таблицы ALBUM_ARTIST",
  supplement: "Таблица",
  kind: table
)  <albumArtist>

Таблица @albumTrack - вспомогательная таблица для для связи многие ко многим музыкального трека к альбомам.

#figure(
  tablex(columns: 5, repeat-header: true,
  [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [],
  [albumId],
  [INTEGER],
  [Идентификатор альбома],
  [NOT NULL, \ FK(ALBUM.id)],
  [],
  [trackId],
  [INTEGER],
  [Идентификатор трека],
  [NOT NULL, \ FK(TRACK.id)],
  [],
  [position],
  [INTEGER],
  [Позиция трека в альбоме],
  [NOT NULL,\ CHECK \(position  \>\= 0)]
  ),
  caption: "Описание логической структуры таблицы ALBUM_TRACK",
  supplement: "Таблица",
  kind: table
) <albumTrack>

Таблица @artist содержит информацию об исполнителях.


#figure(
  tablex(columns: 5, repeat-header: true,
  [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [PK],
  [id],
  [INTEGER],
  [Уникальный идентификатор исполнителя],
  [\>0, NOT NULL],
  [],
  [name],
  [TEXT],
  [Имя исполнителя],
  [NOT NULL],
  [],
  [cover],
  [TEXT],
  [Ссылка на обложку исполнителя],
  [],
  ),
  caption: "Описание логической структуры таблицы ARTIST",
  supplement: "Таблица",
  kind: table
) <artist>

Таблица @track содержит информацию о треках.


#figure(
  tablex(columns: 5, repeat-header: true,
  [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [PK],
  [id],
  [INTEGER],
  [Уникальный идентификатор трека],
  [NOT NULL],
  [],
  [title],
  [TEXT],
  [Название трека],
  [],
  [],
  [duration],
  [INTEGER],
  [Продолжительность трека (в секундах)],
  [],
  [],
  [link],
  [TEXT],
  [Ссылка на трек],
  [DEFAULT NULL],
  [],
  [isExplicit],
  [INTEGER],
  [Флаг эффективности (0 или 1)],
  [NOT NULL, \ CHECK \ (isExplicit IN (0, 1)) DEFAULT 0],
  [],
  [linkDateUpda-ted],
  [TEXT],
  [Время последнего обновления ссылки на трек],
  [],
  ),
  caption: "Описание логической структуры таблицы TRACK",
  supplement: "Таблица",
  kind: table
) <track>

Таблица @lastTable содержит информацию о пользователях.

#figure(
  tablex(columns: 5, repeat-header: true,
  [Признак ключа], [Имя поля], [Тип данных поля], [Назначение],
  [Ограничения],
  [PK],
  [uid],
  [TEXT],
  [Уникальный идентификатор пользователя],
  [NOT NULL, UNIQUE],
  [],
  [displayName],
  [TEXT],
  [Отображаемое имя пользователя],
  [NOT NULL],
  [],
  [avatarLink],
  [TEXT],
  [Ссылка на аватар пользователя],
  [NOT NULL, UNIQUE],
  [],
  [token],
  [TEXT],
  [Токен пользователя],
  [NOT NULL],
  [],
  [isPlus],
  [INTEGER],
  [Флаг подписки (0 или 1)],
  [NOT NULL, \ CHECK(isPlus IN (0, 1))],
  [],
  [yandexMusicId],
  [INTEGER],
  [Идентификатор пользователя в Яндекс.Музыке],
  [UNIQUE],
  ),
  caption: "Описание логической структуры таблицы USER",
  supplement: "Таблица",
  kind: table
) <lastTable>


#pagebreak()

= Разработка дополнения к техническому заданию, модификация приложения

Основанием для выпуска протокола разногласий №1 к техническому заданию является решения производителя в связи с практическими результатами эксплуатации приложения "Yay!". Протокол разногласий к техническому заданию указан в приложении Б.

При окончании составления протокола разногласий было принято решение
выпуска дополнения к техническому заданию.
Дополнение к техническому заданию представлено в приложении В.

#pagebreak()

= Оценка качества информационной системы

В ходе ручного тестирования приложения была составлена таблица @cringe_table. Оценивание происходит
от 0 до 1 с пояснением оценки в комментарии. Оценивание было произведено экспертным методом.

#figure(
    table(
	columns: (2fr, 1fr, 3fr),
	align: center,
	table.header(
	    [Критерий], [Оценка], [Комментарий]
	),
	[Функциональность], [0.5], [Заявленная функциональность реализована не в полном составе
	],
	[Скорость работы], [0.8], [При воспроизведении музыкальной композиции в приложении наблюдались небольшие задержки],
	[Дизайн интерфейса], [0.9], [Дизайн соответствует стандартам Material Design 3],
	[Удобство использования], [0.7], [
Разработка интерфейса проводилась группой учащихся и тестировалась на рабочей группе: преподаватели.

	    Фокус группа показала что интерфейс прост в понимании.],
	[Безопасность данных], [1], [Из личных данных пользователя хранится только аутентификационный токен пользователя],
	[Совместимость с различными устройствами и платформами], [0.6], [Работает на устройствах с операционными системами: Windows, Linux, Android, MacOS]
	
	

    ),
    caption: "Оценка качества приложения",
    
) <cringe_table>


Помимо качественности приложения, необходимо оценить и его надежность. Критерии и метрики для оценки надежности представлены в ГОСТе 28195-89.
Фактор надёжности включает в себя два критерия:

| Устойчивость функционирования – способность обеспечивать продолжение работы программы после возникновения отклонений, вызванных сбоями технических средств, ошибками во входных данных и ошибками обслуживания;
| Работоспособность – способность программы функционировать в заданных режимах и объёмах обрабатываемой информации в соответствии с программными документами при отсутствии сбоев технических средств.

Оценка каждого из критериев включает в себя оценки метрик. В своей оценке каждая из метрик содержит оценки так называемых оценочных элементов. Каждый оценочный элемент обозначается кодом, составленным из 5 символов. Оценочные элементы и их коды приведены в таблице @fuck_table и на рисунке @fuck_table2.

#let results = csv("./src/tables/fuck.csv")

#figure(
    table(
	columns: 4,
	table.header([Код элемента], [Наименование],[Метод оценки],[Оценка]),
	..results.flatten(),
    ),
    caption: "Оценочные элементы"
) <fuck_table>

#figure(
    image(ip("fuck2.png")),
    caption: "Оценочные элементы (продолжение)"
) <fuck_table2>

Оценим надёжность системы. Сначала определим оценочные элементы используемых метрик и занесём в таблицу @fuck_table3.

#let results2 = csv("./src/tables/fuck2.csv")

#figure(
    table(
	columns: 4,
	table.header([Код оценочного
элемента], [Метод оценки],[Выбранное значение],[Обоснование]),
	..results2.flatten(),
    ),
    caption: "Определение оценочных элементов"
) <fuck_table3>


По полученным значениям оценочных элементов рассчитываются задействованные согласно данной фазе проектирования метрики. Оценка метрик представлена в таблице @fuck_table4.


#figure(
    table(
	columns: 3,
	table.header([№],[Метрики],[Оценка]),
	[1], [Средства восстановления при ошибках при вводе], [(0.8 + 0.8 + 0.3 + 0.2 + 0.8 + 0.7 + 0.8) / 7 = 0.76],
	[2], [Средства восстановления при сбоях оборудования ], [Отсутствуют],
	[3], [Реализация управления средствами восстановления], [0.6],
	[4], [Функционирование в заданных режимах], [0.4],
	[5], [Обеспечение обработки заданного объема информации], [(1 + 1) / 2 = 1]
    ),
    caption: "Оценка метрик"
) <fuck_table4>

Далее необходимо выбрать весовой коэффициент для каждой метрики. Он определяет значимость этой метрики для дальнейшего расчёта. Для каждого критерия сумма весов входящих в него метрик должна равняться единице.

Весовые коэффициенты метрик указаны в таблице @fuck_table5.

#figure(
    table(
	columns: 2,
	table.header([Метрика],[Весовой коэффициент]),
	[Средства восстановления при ошибках при вводе], [0.1],
	[Средства восстановления при сбоях оборудования], [Отсутствует],
	[Реализация управления средствами восстановления], [0.1],
	[Функционирование в заданных режимах], [0.8],
	[Обеспечение обработки заданного объема информации], [0.6]

    ),
    caption: "Оценка метрик"
) <fuck_table5>

Далее считаются абсолютные показатели каждому критерию фактора надёжности. Для этого необходимо суммировать произведение веса и оценки каждый метрики внутри каждого критерия.

Показатели каждому критерию указаны в таблице @fuck_table6.

#figure(
    table(
	columns: 2,
	table.header([Критерий],[Оценка]),
	[Устойчивость функционирования], [0.76 \* 0.1 + 0.8 \* 0.1 = 0.156],
	[Работоспособность], [0.8 \* 0.4 + 1 \* 0.6 = 0.92],

    ),
    caption: "Оценка метрик"
) <fuck_table6>

Выберем весовой коэффициент для каждого критерия. Как и для метрик, весовой коэффициент определяет значимость данного критерия для дальнейшего расчёта. Сумма весов должна равняться единице. 

Весовые коэффициенты представлены в таблице .

#figure(
    table(
	columns: 2,
	table.header([Критерий],[Весовой коэффициент]),
	[Устойчивость функционирования], [0.3],
	[Работоспособность], [0.7],

    ),
    caption: "Оценка метрик"
) <fuck_table7>

Получим, что K = 0,156 \* 0,3 + 0,92 \* 0,7 = 0,69. Что означает, что надёжность программы удовлетворяет требованиям.

#pagebreak()

= Тестирование

== План тестирования

В таблице, представлены идентификационные данные тест-плана.

#figure(
    table(
	columns: 2,
	// table.header([Параметр], [])
	[Идентификатор плана тестирования], [Yay-Master-6d0c1e19],
	[Короткое имя], [YM],
	[Автор], [<NAME>],
    ),
    caption: "Информация об тест-плане"
)

=== Введение

Цель: описать набор тестов, которые необходимо выполнить для проверки функциональности и удобства использования приложения "Yay".

Уровень: Мастер


=== Тестовые сценарии
- Проверить работу на всех обозначенных операционных системах.
- Проверить авторизацию с помощью логина и пароля.
- Проверить авторизацию с помощью токена.
- Воспроизвести музыку.

=== Функции подлежащие тестированию

- авторизация через Яндекс;
- прослушивание музыки из библиотеки Яндекс Музыка;

=== Функции не подлежащие тестированию

- совместное прослушивание треков двумя разными пользователями.
- функция "Моя волна", которая обеспечивает бесконечный поток музыки;
- возможность установить плагины от сторонних разработчиков;
- переключение цветовой схемы приложения;

=== Программные или аппаратные зависимости

Система должна работать на современных системах: Windows 10-11 с поддержкой DirectX 12, MacOS версии выше Catalina, Linux 6.0 и выше с визуальным окружением Gnome 40 и выше, Android 10 и выше, IOS 16 и выше.

=== Зависимости и риски

| Сторонние библиотеки: Приложение может зависеть от сторонних библиотек, которые могут иметь свои уязвимости. Это может привести к проблемам безопасности, если эти уязвимости не будут должным образом устранены.

| Внешние сервисы: Приложение может зависеть от внешних сервисов, которые могут быть недоступны или работать некорректно. Это может привести к сбоям в работе приложения.


== Тест-кейс

// Аннотация к тестам приведена в таблице @anotation.

#figure(
	table(columns: (1fr, 1fr),
	[Название проекта],[Yay],
	[Рабочая версия],[0.1],
	[Имя тестирующего], [<NAME>],
	[Дата теста], [07.04.2024]
	),
	caption: "Аннотация к тестам",
) <anotation>

В таблице @test_data приведены тестовые данные для автоматических тестов.

#figure(
    table(columns: 2,
	table.header(
	    [Имя], [Данные]),
	[Email], [<EMAIL>],
	[Password], [<PASSWORD>],
	[Token], [#text("<KEY>")]
    ),
    caption: "Тестовые данные"
) <test_data>

В таблице @tests2 приведены автоматические тесты.

#figure(
    table(columns: (1.2fr, 1.3fr, 2fr, 3fr, 1.7fr, 1.7fr, 1.4fr),
	table.header([Тестовый пример №], [Приоритет тестирования], [Краткое изложение теста], 
	    [Этапы теста], [Ожидаемый результат], [Фактический результат], [Статус]),
	[ТП-01], [Высокий], [Запуск приложения на всех операционных системах], [
	    -- Запуск приложения на Android;
		
	    -- Запуск приложения на Linux;
	    
	    -- Запуск приложения в веб.
	],[Запуск приложения без вылетов],[Запуск приложения без вылетов],[Пройден],
	[ТП-02], [Высокий], [Авторизация с помощью логина и пароля], [
	    -- Выбор способа авторизации с помощью логина и пароля;

	    -- Ввод логина и пароля;

	    -- Нажать кнопку "Войти".

	], [Отображение главной страницы приложения], [Отображение главной страницы приложения], [Пройден],
	[ТП-03], [Высокий], [Авторизация с помощью токена], [
	    -- Выбор способа авторизации с помощью токена;

	    -- Ввод токена;

	    -- Нажать кнопку "Войти".
	], [Отображение главной страницы приложения], [Отображение главной страницы приложения], [Пройден],
	[ТП-04], [Высокий], [Воспроизведение музыки], [-- Пройти авторизацию любым способом;

	    -- Войти в любой альбом или плейлист;

	    -- Нажать по любому треку.
	], [Воспроизведение музыкальной композиции], [Воспроизведение музыкальной композиции], [Пройден]
	),
	caption: "Автоматические тесты",
) <tests2>



== Выводы о тестировании

Тестирование показало, что приложение "Yay" соответствует всем поставленным требованиям. Не было обнаружено никаких критических ошибок или сбоев.


#pagebreak()
= Внедрение

Поскольку наше приложение ориентировано на развлечения и предназначено для широкой аудитории, не привязанной к определенным компаниям, процесс его внедрения будет представлен как публикация в магазине приложений.

== План внедрения

1. Подготовка ресурсов
    1. Создание учётной записи разработчика в магазине приложения 
    2. Подготовка материалов для публикации:
	- Скомпилированное приложение;
	- Иконки в необходимых форматах;
	- Скриншоты;
	- Описание;
	- Категория приложения.
2. Отправка на модерацию
3. Публикация
4. Маркетинг и продвижение
    - Закупка рекламы в различных соц. сетях
    - Создание сайта приложения

== Стратегии, цели и сценарии внедрения

+ Стратегии:

  - Привлечение внимания:
    - Использование ярких и привлекательных мультимедийных материалов
      для захвата внимания пользователей в магазине приложений.
    - Запуск маркетинговых кампаний, направленных на увеличение
      видимости приложения в поисковой выдаче магазина.
  - Удержание пользователей:
    - Разработка интересного и привлекательного контента, способного
      удерживать пользователей в приложении на протяжении длительного
      времени.
    - Внедрение системы вознаграждений, достижений и других механик,
      стимулирующих возвращение пользователей.
  - Масштабирование:
    - Анализ рынка и поиск новых возможностей для расширения аудитории и
      увеличения числа загрузок приложения.
    - Разработка стратегии расширения на другие платформы и рынки.

+ Цели:

  - Увеличение числа загрузок:
    - Основная цель - добиться максимального числа загрузок приложения в
      первые недели после публикации.
    - Измерение успеха по числу установок и показателям конверсии.
  - Повышение вовлеченности пользователей:
    - Целью является создание приложения, способного удерживать
      пользователей и мотивировать их к долгосрочному использованию.
    - Измерение успеха по метрикам удержания, частоте и
      продолжительности сеансов и т.д.
  - Увеличение доходов:
    - Увеличение доходов от покупок в приложении или от рекламы.
    - Измерение успеха по объему выручки и другим метрикам монетизации.

+ Сценарии внедрения:
  - Бесплатное приложение с рекламой:
    - Приложение предоставляется пользователям бесплатно, но
      монетизируется за счет показа рекламы.
    - Стратегия внедрения: акцент на привлечении как можно большего
      числа пользователей, чтобы увеличить объем показов рекламы.
  - Фримиум-модель:
    - Приложение предоставляется бесплатно, но пользователи могут
      покупать дополнительный контент или функции внутри приложения.
    - Стратегия внедрения: предоставление базового функционала
      бесплатно, а затем стимулирование пользователей к покупке
      премиум-контента.
  - Платное приложение:
    - Пользователи платят за загрузку и использование приложения.
    - Стратегия внедрения: создание высококачественного и уникального
      контента, который стоит своей цены, и акцент на его преимуществах
      в маркетинговых кампаниях.

== Автоматизация процесса внедрения информационной системы

Для автоматизации процесса внедрения можно использовать GitHub Actions, которые позволят при создании нового релиза делать публикацию в необходимых магазинах приложений.

#pagebreak()

= Обеспечение безопасности программного обеспечения

Для обеспечения безопасности программного обеспечения необходимо предпринять ряд мер для минимизации актуальных угроз информационной безопасности в процессе разработки. Анализ существующих угроз поможет определить эффективные стратегии противодействия.

== Анализ угроз безопасности

При недостаточном соблюдении мер безопасности любое программное обеспечение подвержено различным угрозам конфиденциальности и целостности данных. Однако, когда речь идет о созданных модулях, потенциальные угрозы могут возникнуть во время процесса конструирования и интеграции ПО. Это объясняется тем, что при проектировании модулей обычно уделяется основное внимание математическим аспектам, требования формулируются минимально, а тестирование функционала часто производится вручную, что не всегда способствует выявлению потенциальных уязвимостей и вредоносных компонентов.

Из этого вытекает ряд возможных угроз, о которых будет рассказано далее.

== Перечень возможных угроз безопасности ПО

- Риск внедрения уязвимостей в исходный код программы в процессе её разработки.
- Опасность появления уязвимостей в программе через использование уязвимых компонентов, заимствованных у сторонних разработчиков программного обеспечения.
- Угроза возникновения уязвимостей в программе из-за ошибок в эксплуатационной документации, допущенных в процессе их создания и хранения.

== Перечень мер, предпринятых для обеспечения безопасности ПО

Для предотвращения упомянутых угроз безопасности ПО, учитывая особенности выбранного языка и фреймворка, были предприняты следующие шаги:

- Применение инструментов статического анализа кода: Ktlint, Detekt.
- Проведение код-ревью: на протяжении разработки проводились регулярные обзоры кода руководителем отдела разработки.
- Использование безопасных библиотек и фреймворков: в процессе разработки применялись только проверенные и популярные библиотеки и фреймворки, которые мало подвержены уязвимостям.
- Защита доступа к коду: исходный код хранился на локальном git-сервере, что повышало уровень защиты от непроизвольного внедрения уязвимостей.
- Использование системы контроля версий: Git (локальный сервер Gitea).
- Соблюдение государственных стандартов при написании документации.

== Выводы об обеспечении безопасности информации для напиcанного приложения

После тщательного анализа потенциальных угроз безопасности мы приняли ряд мер для предотвращения возможных инцидентов в контексте разработанной системы. Эти действия значительно снижают вероятность возникновения угроз, повышая уровень безопасности модулей и обеспечивая их надежное функционирование во взаимодействии с остальными компонентами робота, исключая риски информационных угроз.
// #pagebreak()


#pagebreak()

= Разработка руководства системному программисту

Руководство системному программисту предоставлено в приложении Г.

#pagebreak()

#ch("Заключение")

В ходе выполнения производственной практики по направлению ПМ03 "Сопровождение и обслуживание программного обеспечения компьютерных систем" все поставленные задачи и цели были успешно достигнуты.

Основное внимание было уделено обеспечению безопасности разработанных модулей. Это включало в себя тщательный анализ потенциальных уязвимостей, внедрение соответствующих мер по защите и проведение тестирования безопасности. Благодаря этим усилиям модули стали более надежными и защищенными от возможных атак.

Кроме того, была разработана подробная сопроводительная документация к каждому модулю, что обеспечит пользователям более глубокое понимание и использование нового функционала, а также упростит поддержку и сопровождение программного обеспечения.
Был разработан и представлен план внедрения написанных программных модулей, что позволит эффективно интегрировать их в уже существующую систему и использовать в реальных производственных условиях.

Таким образом, можно с уверенностью заключить, что производственная практика была выполнена успешно, демонстрируя высокий профессионализм и компетентность.

#pagebreak()

#ch("Список использованных источников")

#bibliography("bibliography.yml", title: none, full: true, style: "gost-r-705-2008-numeric")

#pagebreak()

#ch("Приложение А Разработка технического задания")

#counter(heading).update(0)

#show heading.where(level: 1): it => [ #it]


#fh("Введение")

Настоящее техническое задание распространяется на разработку кроссплатформенного приложения под названием «Yay»

Предложенное приложение - альтернатива приложению "Яндекс Музыка", включающее все функции оригинального приложения и решающее проблемы: отсутствие возможности совместного прослушивания музыки различными пользователями, отсутствие множества настроек, закрытость системы, путём распространение исходного кода для дальнейшей модернизации системы, обеспечение возможности установки дополнительных модулей (plug-in'ов) сторонних разработчиков.

Основная цель разрабатываемой программы — предоставить альтернативное мультиплатформенное открытое приложение по воспроизведению музыки из сервиса Яндекс Музыка, обеспечивающее единство функций в различных версиях.

#fh("Основание для разработки")

Основание для разработки является задание на производственную практику предприятия "Валдай роботы".

#fh("Назначение разработки")

#fhh("Функциональное назначение")

Создание альтернативного приложения для сервиса Яндекс Музыка, с возможностью прослушивания музыки различными пользователями, расширенными настройками, открытым исходным кодом для модернизации, и возможностью инсталляции дополнительных модулей от сторонних разработчиков. Это приложение предоставит мультиплатформенный и открытый доступ к функциям Яндекс Музыки, обеспечивая единство и удобство использования на различных устройствах.

#fhh("Эксплуатационное назначение")

Обеспечение пользователям доступа к сервису Яндекс Музыка через различные устройства (мобильные устройства, планшеты, компьютеры) с возможностью совместного прослушивания музыки, расширенными настройками, а также с возможностью установки дополнительных модулей от сторонних разработчиков для улучшения функциональности приложения. Это приложение предназначено для использования конечными пользователями с целью удобного и качественного доступа к музыкальному контенту.

#fh("Требование к информационной системе")
#fhh("Требование к функциональным характеристикам")

Функциональными характеристиками системы являются:
- авторизация через Яндекс;
- прослушивание музыки из библиотеки Яндекс Музыка;
- перемешивание треков в альбоме или плейлисте;
- цикличное прослушивание треков в альбоме или одно трека;
- функция "Моя волна", которая обеспечивает бесконечный поток музыки;
- возможность установить плагины от сторонних разработчиков;
- совместное прослушивание треков;
- переключение цветовой схемы приложения;
- защита от необдуманных и случайных действий пользователя;
- совместное прослушивание треков двумя разными пользователями.
Входными данными являются:
- логин и пароль пользователя.
Выходными данными является:
- список музыкальных композиций;
- подборки музыкальных композиций под пользователей;

#fhh("Требование к надёжности")

| Приложение должно корректно работать на всех обозначенных операционных системах (Windows, IOS, MacOS, Linux, Android);

| Обработка некорректных входных данных, путём выдачи информационного сообщения пользователям;

| Корректная работа без подключения к интернету;

| Время восстановление системы после отказа не должно быть более 1 минуты;

Действия оператора в ходе отказа:
- Закрыть программу;
− Проверить подключение к интернету;
− Очистить кэш и данные приложения;
− Открыть программу заново.


#fhh("Условия эксплуатации")

Наличие у пользователя устройства, который выполняет минимальные требования, перечисленные в пункте 1.1.4.4 Требования к составу и параметрам технических средств.

4.3.1 Климатические условия эксплуатации

Требований к климатическим условиям эксплуатации не предъявляется.

4.3.2 Требования к видам обслуживания

Обслуживание не требуется.

4.3.3 Требования к численности и квалификации персонала

Персонал не требуется.

\

#fhh("Требования к составу и параметрам технических средств")

- Операционная система: Windows, macOS, Linux, Android;
- Минимальное кол-во оперативной памяти: 4 Гб;
- Минимальная видеокарта: Intel HD Graphics;
- Минимальный процессор: Intel Core i3 2.5GHz;
- Минимальный объем доступной памяти жёсткого диска: 100 Мб;
- Минимальное разрешение экрана: 1080x600;

#fhh("Требования к информационной и программной совместимости")

4.5.1 Требования к исходным кодам и языкам программирования
Исходные коды программы должны быть написаны на языке Kotlin.

4.5.2 Требования к программным средствам, используемым программой

Среда разработки приложения - IntelliJ IDEA Community Edition.

Библиотеки используемые приложением: Exposed, Compose Multiplatform, Kotlin Multiplatform.

Базы данных используемые приложением: PostgreSQL, SQLite.

Система должна работать на современных системах: Windows 10-11 с поддержкой DirectX 12, MacOS версии выше Catalina, Linux 6.0 и выше с визуальным окружением Gnome 40 и выше, Android 10 и выше.

#fhh("Требования к графическому дизайну")

Система должна выполнять следующие требования к графическому дизайну:
| Интуитивный адаптивный интерфейс под разные экраны и соотношения;

| В стиле Material You, с применением основных принципов и элементов этого дизайна.

| Возможность изменить тему интерфейса.

#fhh("Требования к программной документации")

Состав программной документации:
– "Yay!". Техническое задание (ГОСТ 19.201 78);
– "Yay!". Руководство системного программиста. (ГОСТ 19.503-79);

#fh("Стадии и этапы разработки")
- Составление Технического задания – 1 апреля 2024;
- Разработка приложения – 8 апреля 2024;

#fh("Порядок контроля и приёма работы")

Приём программы должен осуществляться руководителем производственной практики от предприятия (<NAME>).

#pagebreak()

#ch("Приложение Б Протокол разногласий")

#grid(columns: (1fr, 10pt, 1fr),
    align: center,
    gutter: 10pt,
    text("УТВЕРЖДАЮ"),
    text(""),
    text("СОГЛАСОВАНО"),
    text("Технический директор"),
    text(""),
    text("Практикант,\n Разработчик RMS"),
    v(5pt), v(5pt), v(5pt),
    grid.cell(align: right)[В.П. Косов],
    text(""),
    grid.cell(align: right)[В.Д. Панков],
    grid.cell(align: right)["8" апреля 2024 г.],
    [],
    grid.cell(align: right)["8" апреля 2024 г.]
)

#v(42pt)

#align(center)[ПРОТОКОЛ РАЗНОГЛАСИЙ \
К ТЕХНИЧЕСКОМУ ЗАДАНИЮ \
НА РАБОТУ]

#v(18pt)

#align(center)[«Разработка мобильного приложения «Музыкальный плеер»» \ под названием «Yay»
]

#pagebreak()

#cfh0("Протокол разногласий к ТЗ «Yay»")

#table(
    columns: (1fr, 1.2fr, 1fr),
    inset: 10pt,
    table.header(
	align(center)[Автор], align(center)[Замечание], align(center)[Комментарий]
    ),
    [<NAME>. ], [Пункт 4.4 Добавить поддержку операционной системы IOS], [#highlight(fill: red)[Не принято] \ В связи закрытости системы и запретом использования данной техники во многих государственных учереждениях],
    [<NAME>.], [Пункт 4.4 Повысить системные требования приложения, из-за проблем работы приложения на текущих], [#highlight(fill: green)[Принято] \ Решение проблем с производственностью могло бы занять много времени],
    [<NAME>.], [Пункт 4.1 Добавить функцию: Авторегулирование громкости композиции ], [#highlight(fill: red)[Не принято] \ Решение исполнителя ],
    [<NAME>.], [Пункт 4.5.2 Добавить библиотеку для работу с базой данных SQLDelight и загрузки изображений Coil], [#highlight(fill: green)[Принято] \ Эти библиотеки упростят процесс разработки],
    [<NAME>], [Пункт 5 Передвинуть этап разработки на более долгий срок], [#highlight(fill: green)[Принято] \ Требование заказчика]
)

#pagebreak()

#ch("Приложение В Дополнение к техническому заданию")

#v(5pt)

#grid(columns: (1fr, 10pt, 1fr),
    align: center,
    gutter: 10pt,
    text("УТВЕРЖДАЮ"),
    text(""),
    text("СОГЛАСОВАНО"),
    text("Технический директор"),
    text(""),
    text("Практикант,\n Разработчик RMS"),
    v(5pt), v(5pt), v(5pt),
    grid.cell(align: right)[В.П. Косов],
    text(""),
    grid.cell(align: right)[<NAME>],
    grid.cell(align: right)["11" апреля 2024 г.],
    [],
    grid.cell(align: right)["12" апреля 2024 г.]
)


#v(42pt)

#align(center)[ДОПОЛНЕНИЕ №1 \
    К ТЕХНИЧЕСКОМУ ЗАДАНИЮ \
НА РАБОТУ]

#v(18pt)

#align(center)[«Разработка мобильного приложения «Музыкальный плеер»» \ под названием «Yay»
]

#v(18pt)


#table(
    columns: (1fr, 1fr),
    inset: 10pt,
    table.header(
	align(center)[Имеется], align(center)[Должно быть]
    ),
    [4.4 Требования к составу и параметрам технических средств
	| Операционная система: Windows, macOS, Linux, Android;

	| Минимальное кол-во оперативной памяти: 4 Гб;

	| Минимальная видеокарта: Intel HD Graphics;

	| Минимальный процессор: Intel Core i3 2.5GHz;

	| Минимальный объем доступной памяти жёсткого диска: 100 Мб;

	| Минимальное разрешение экрана: 1080x600;
    ], [4.4 Требования к составу и параметрам технических средств
	| Операционная система: Windows, macOS, Linux, Android;

	| Минимальное кол-во оперативной памяти: 6 Гб;

	| Минимальная видеокарта: AMD Radeon R7 360;

	| Минимальный процессор: AMD FX 4300;

	| Минимальный объем доступной памяти жёсткого диска: 1 Гб;

	| Минимальное разрешение экрана: 600x600;

    ],
    [4.5.2 Требования к программным средствам, используемым программой
Среда разработки приложения - IntelliJ IDEA Community Edition.
Библиотеки используемые приложением: Exposed, Compose Multiplatform, Kotlin Multiplatform.
Базы данных используемые приложением: PostgreSQL, SQLite.
Система должна работать на современных системах: Windows 10-11 с поддержкой DirectX 12, MacOS версии выше Catalina, Linux 6.0 и выше с визуальным окружением Gnome 40 и выше, Android 10 и выше.
    ],
    [4.5.2 Требования к программным средствам, используемым программой
Среда разработки приложения - IntelliJ IDEA Ultimate Edition.
Библиотеки используемые приложением: SQLDelight, Compose Multiplatform, Kotlin Multiplatform, Ktor, Coil.
Базы данных используемые приложением: PostgreSQL, SQLite.
Система должна работать на современных системах: Windows 11 с поддержкой DirectX 12, MacOS версии выше Catalina, Linux 6.0 и выше с визуальным окружением Gnome 40 и выше, Android 10 и выше.
    ],
    [5 Стадии и этапы разработки

	-- Составление Технического задания – 1 апреля 2024;

-- Разработка приложения – 8 апреля 2024;

    ],[5 Стадии и этапы разработки

	-- Составление Технического задания – 1 апреля 2024;

-- Разработка приложения – 28 апреля 2024;

    ]
    
)

#v(1fr)

#table(
    columns: (1fr, 1fr),
    inset: 10pt,
    align(center)[Технический директор],
    align(center)[#set par(justify: true, leading: 1em)
	Практикант, \ Разработчик RMS],
    align(end)[#set par(justify: true, leading: 1em)
	<NAME> \ "30" апреля 2024 г.],
    align(end)[#set par(justify: true, leading: 1em)
	<NAME> \ "30" апреля 2024 г.]
    
)

#pagebreak()

#ch("Приложение Г Руководство системному программисту")

#counter(heading).update(0)

#fh("Общие сведения о программе")

#fhh("Назначение программы")

"Yay!" -- кроссплатформенное приложение, представляющее из себя альтернативный клиент сервиса Яндекс Музыка. Оно включает все основные
функции оригинального приложения и обладает дополнительными, такими как:
совместное прослушивание, система плгаинов и генерация темы приложения на основе обложки трека.

#fhh("Функции программы")

- авторизация через Яндекс;
- прослушивание музыки из библиотеки Яндекс Музыка;
- перемешивание треков в альбоме или плейлисте;
- цикличное прослушивание треков в альбоме или одно трека;
- функция "Моя волна", которая обеспечивает бесконечный поток музыки;
- возможность установить плагины от сторонних разработчиков;
- совместное прослушивание треков;
- переключение цветовой схемы приложения;
- защита от необдуманных и случайных действий пользователя;
- совместное прослушивание треков двумя разными пользователями.

#fhh("Минимальный состав технических средств")

| Операционная система: Windows, macOS, Linux, Android;

| Минимальное кол-во оперативной памяти: 6 Гб;

| Минимальная видеокарта: AMD Radeon R7 360;

| Минимальный процессор: AMD FX 4300;

| Минимальный объем доступной памяти жёсткого диска: 1 Гб;

| Минимальное разрешение экрана: 600x600;

#fhh("Требование к персоналу")

Требование к персоналу не требуется

#fh("Структура программы")

Программа структурно состоит из:

\1. Основное приложение (Kotlin)
1.1. Нативные функции на определённой платформе
1.2. Общие функции, выполняющиеся на всех платформах
\2. API Яндекс Музыка
\3. Локальная база данных Sqlite

Диграмма компонентов представлена на рисунке @fuck_dia.

#figure(image(ip("structure2.png")), caption: "Диаграмма компонентов"
) <fuck_dia>

Основное приложение (Kotlin) -- риложения включающее нативные и
общие части для каждой платформы. Нативные будут выполняться только на
определённой платформе. Общие же функции выполняются вне зависимости
от платформы.

API Яндекс Музыка — интерфейс для связи с сервисом Яндекс
Музыка

Локальная база данных Sqlite — база данных, в которой хранится
информация о треках

#fhh("Сведения о связях составными частями программы")

Связь с API Яндекс Музыка осуществляется через протокол HTTPS,
оттуда получаются все треки, рекомендации и настройки пользователя.

Отображение информации происходит через общие функции,
воспроизведение и сохранение данных происходит через нативные функции
приложение.

Сохранение данных происходит через библиотеку SqlDelight с
использованием JDBC в базу данных Sqlite.

#fhh("Сведения о связи с другими программами")

Приложение имеет явную связь с сервисом Яндекс Музыка,
использованием API с данным приложением для получения данных о треках,
пользователе и его рекомендация.

#fh("Настройка программы")

#fhh("Настройка на состав технических средств")

Не требуется.

#fhh("Настройка на состав программных средств")

Не требуется.

#fh("Проверка программы")

Работоспособность программы «Yandex Music 3» проверяется запуском
программы. При запуске откроется окно, представленное на рисунке @fuck_you.


#figure(image(ip("screen.png")), caption: "Окно при запуске") <fuck_you>

#fh("Сообщение системному программисту")

При ошибке «Unsupported Java» при сборке приложения,
представленная на рисунке @fuck_unsupported, установите версию JDK для сборки в
настройках на 20, на рисунке @fuck_idea, показан пример настройки сборки в IntelliJ IDEA.

#figure(image(ip("Unsupported.png")), caption: "Окно при запуске") <fuck_unsupported>

#figure(image(ip("IDEA.png")), caption: "Окно при запуске") <fuck_idea>

Требуется проверить работоспособность тестов до попытки сборки
приложения.
Действия оператора в ходе некорректного выполнения тестов:
- проверить, актуальность версии приложения;
- очистить кэш сборки, командой «gradle clean»;
- проверить, подключение к интернету.
